groupadd mysql
useradd -r -g mysql mysql
axel -n 50 https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.21-el7-x86_64.tar.gz
tar xvf mysql-5.7.21-el7-x86_64.tar.gz -C /usr/local/
mv /usr/local/mysql-5.7.21-el7-x86_64 /usr/local/mysql/
chown -R mysql:mysql /usr/local/mysql/
mkdir -pv /home/data/mysql_330{6...9}
mkdir /home/data/logs
chown -R mysql:mysql /home/data/
cd /usr/local/mysql/vi /etc/profile export PATH=$PATH:/usr/local/mysql/bin source /etc/profile
初始化实例目录:
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/home/data/mysql_3306 /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/home/data/mysql_3307 /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/home/data/mysql_3308 /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/home/data/mysql_3309
cp -a ./support-files/my-default.cnf /etc/my.cnf cp -a ./support-files/mysql.server /etc/init.d/mysqld
修改配置: vi /etc/my.cnf
[client] default-character-set = utf8 [mysqld_multi] mysqld = /usr/local/mysql/bin/mysqld_safe mysqladmin =/usr/local/mysql/bin/mysqladmin log =/home/data/logs/mysqld_multi.log [mysqld6] basedir=/usr/local/mysql datadir=/home/data/mysql_3306 port=3306 server_id=6 socket=/home/data/mysql_3306/mysql.sock symbolic-links=0 character_set_server=utf8 pid-file=/home/data/mysql_3306/mysql.pid wait_timeout=1814400 max_connections = 1500 skip-name-resolve log_bin = mysql-bin log-slave-updates auto-increment-increment = 2 auto-increment-offset = 1 [mysqld7] basedir=/usr/local/mysql datadir=/home/data/mysql_3307 port=3307 server_id=7 socket=/home/data/mysql_3307/mysql.sock symbolic-links=0 character_set_server=utf8 pid-file=/home/data/mysql_3307/mysql.pid wait_timeout=1814400 max_connections = 1500 skip-name-resolve log_bin = mysql-bin [mysqld8] basedir=/usr/local/mysql datadir=/home/data/mysql_3308 port=3308 server_id=8 socket=/home/data/mysql_3308/mysql.sock symbolic-links=0 character_set_server=utf8 pid-file=/home/data/mysql_3308/mysql.pid wait_timeout=1814400 max_connections = 1500 skip-name-resolve log_bin = mysql-bin [mysqld9] basedir=/usr/local/mysql datadir=/home/data/mysql_3309 port=3309 server_id=9 socket=/home/data/mysql_3309/mysql.sock symbolic-links=0 character_set_server=utf8 pid-file=/home/data/mysql_3309/mysql.pid wait_timeout=1814400 max_connections = 1500 skip-name-resolve log_bin = mysql-bin
参数解释如下:
auto_increment_offset表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto_increment_increment表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
为了避免两台服务器同时做更新时自增长字段的值之间发生冲突。一般在主主同步配置时,需要将两台服务器的auto_increment_increment增长量都配置为2,
而要把auto_increment_offset分别配置为1和2.
#master1上 [mysqld] server-id=101log-bin = mysql-bin auto-increment-increment = 2 auto-increment-offset = 1000 #master2上 [mysqld] server-id=103log-bin = mysql-bin auto-increment-increment = 2 auto-increment-offset = 1001 由于二都只有server-id不同和 auto-increment- offset不同auto-increment-offset是用来设定数据库中自动增长的起点的, 回为这两能服务器都设定了一次自动增长值2,所以它们的起点必须得不同, 这样才能避免两台服务器数据同步时出现主键冲突,配置好重启MySQL读取新的配置文件, 另外auto-increment-increment的值应设为整个结构中服务器的总数,本案例用到两台服务器,所以值设为2
启动多实例数据库:
mysqld_multi --defaults-extra-file=/etc/my.cnf start 6,7,8,9
查看多个实例数据库:
mysqld_multi --defaults-extra-file=/etc/my.cnf report
停止多实例:
mysqld_multi --defaults-extra-file=/etc/my.cnf stop 6,7,8,9
各自登录mysql实例: # 需要指定启动的socket就可以登录到各自的mysql实例
mysql --socket=/home/data/mysql_3306/mysql.sock
--
set password =password('bnh1923');
grant all on *.* to 'root'@'%' IDENTIFIED BY 'bnh1923' with grant option;
flush privileges;
--
修改后登陆mysql实例:
mysql -uroot -pbnh1923 --socket=/home/data/mysql_3306/mysql.sock
mysqladmin命令用法: https://abc.htmltoo.com/thread-620.htm
mysqladmin -uroot -pbnh1923 --socket=/home/data/mysql_3306/mysql.sock
mysqladmin -uroot -pbnh1923 --socket=/home/data/mysql_3306/mysql.sock shutdown (关闭服务)
mysqld_multi --defaults-extra-file=/etc/my.cnf report
...
mysql --socket=/home/data/mysql_3307/mysql.sock
...
启用: mysqld_multi --defaults-extra-file=/etc/my.cnf start 6,7,8,9
检查端口:
ss -lntup |egrep '3306|3307|3308|3309'
tcp LISTEN 0 80 *:3306 *:* users:(("mysqld",19973,22))
tcp LISTEN 0 80 *:3307 *:* users:(("mysqld",20537,22))
...配置主从: master-mysql: mysql -uroot -pbnh1923 --socket=/home/data/mysql_3306/mysql.sock CREATE USER 'repl'@'127.0.0.1' IDENTIFIED BY 'mysql'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'127.0.0.1'; show master status; #mysql-bin.000001 | 613 slave-mysql: mysql -uroot -pbnh1923 --socket=/home/data/mysql_3307/mysql.sock CHANGE MASTER TO MASTER_HOST='127.0.0.1', -> MASTER_PORT=3306, -> MASTER_USER='repl', -> MASTER_PASSWORD='mysql', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=613; start slave; show slave status\G 配置主主: (同理配置主从) 验证数据是否同步: master上创建数据: create database test; use test; create table temp(id int,name varchar(64)); insert into temp values(1,'aaa') insert into temp values(2,'bbb') select * from test.temp; slave上查看数据: select * from test.temp;
cd bin/
./mysqld_safe --user=mysql & /etc/init.d/mysqld restart
chkconfig --level 35 mysqld on
cat /root/.mysql_secret
./mysql -uroot -p
SET PASSWORD = PASSWORD('bnh1923');
use mysql;
update user set host = '%' where user = 'root';
/etc/init.d/mysqld restartmycat集群部署文档
SSH互信免密码登陆,安装部署jdk. host修改, 创建新用户: https://abc.htmltoo.com/thread-43497.htm
jdk安装:1.7
Mysql及zookeeper安装:(略)
Mycat安装
1、下载并解压mycat
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz tar -zxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz mv mycat /home/data/
2、配置schema.xml文件
balance="1"
全部的readHost与stand by writeHost参与select语句的负载均衡writeType="0"
所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后以切换后的为准,切换记录在配置文件中:dnindex.propertiesswitchType="1"
默认值为1,自动切换
cd /home/data/mycat
cp conf/schema.xml conf/schema.xml.bak
vi conf/schema.xml
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"></schema> <dataNode name="dn1" dataHost="node1" database="test" /> <dataHost name="node1" maxCon="10" minCon="5" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"> <heartbeat>select user()</heartbeat> <writeHost host="master1" url="127.0.0.1:3306" user="root" password="mysql"> <readHost host="slave2" url="127.0.0.1:3307" user="root" password="mysql" /> <readHost host="slave3" url="127.0.0.1:3308" user="root" password="mysql" /> <readHost host="slave4" url="127.0.0.1:3309" user="root" password="mysql" /> </writeHost> <writeHost host="master2" url="192.168.56.13:3306" user="root" password="mysql"> <readHost host="slave2" url="192.168.56.13:3307" user="root" password="mysql" /> </writeHost> # (第二组主从,如无,请注释忽略) </dataHost> </mycat:schema>
官方案例:
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!-- 定义一个MyCat的模式,逻辑数据库名称TestDB --> <!-- “checkSQLschema”:描述的是当前的连接是否需要检测数据库的模式 --> <!-- “sqlMaxLimit”:表示返回的最大的数据量的行数 --> <!-- “dataNode="dn1"”:该操作使用的数据节点是dn1的逻辑名称 --> <schema name="zhime-theme" checkSQLschema="true" sqlMaxLimit="100" dataNode="zhime-theme"/> <!-- 定义数据的操作节点 --> <!-- “dataHost="localhost1"”:定义数据节点的逻辑名称 --> <!-- “database="mldn"”:定义数据节点要使用的数据库名称 --> <dataNode name="zhime-theme" dataHost="zhime-theme" database="zhime-theme" /> <!-- 定义数据节点,包括了各种逻辑项的配置 --> <dataHost name="zhime-theme" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <!-- 配置真实MySQL与MyCat的心跳 --> <heartbeat>select user()</heartbeat> <!-- 配置真实的MySQL的连接路径 --> <writeHost host="zhime-theme" url="10.10.111.2:3306" user="root" password="bnh1923"></writeHost> </dataHost> </mycat:schema>
3、配置server.xml文件
cp conf/server.xml conf/server.xml.bak
vi conf/server.xml
<user name="root"> <property name="password">123456</property> <property name="schemas">TESTDB</property> </user>
案例: <user name="root"> <!-- 定义登录mycat对的用户权限 --> <property name="password">bnh1923</property> <property name="schemas">zhime-theme</property> #若要访问zhime-theme 必须现在server.xml 中定义,否则无法访问zhime-theme <!-- 表级 DML 权限设置 --> <!-- <privileges check="false"> <schema name="TESTDB" dml="0110" > <table name="tb01" dml="0000"></table> <table name="tb02" dml="1111"></table> </schema> </privileges> --> </user> <user name="zhime-theme"> <property name="password">bnh1923</property> <property name="schemas">zhime-theme</property> <property name="readOnly">false</property> <!-- 配置是否允许只读 --> </user>
mycat结合MySQL的双主(主从)实现读写分离,修改好.启动mycat.
./bin/mycat start # 启动mycat
ss -lntup |egrep '(8066|9066)' # 验证mycat服务是否正常
tcp LISTEN 0 100 :::8066 :::* users:(("java",16546,79))
tcp LISTEN 0 100 :::9066 :::* users:(("java",16546,75))master端配置mycat连接账号:
mysql -uroot -pbnh1923 --socket=/home/data/mysql_3306/mysql.sock
GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY 'bnh1923';
在mycat服务器上安装mysql服务,但是不启动.
使用mysql的客户端连接mycat.
mysql -uroot -pbnh1923 --socket=/home/data/mysql_3306/mysql.sock -P 8066
#mysql -uroot -p -P 8066 -h 127.0.0.1 #连接mycat,初始密码123456#
show databases;
use test;
insert into temp values(3,'ccc');
slave端查看数据是否同步:
select * from test.temp;
多组主主服务自动迁移-测试
关闭node2-master的MySQL服务:
mysql -uroot -pbnh1923 -P 3066 -h 127.0.0.1 mysql> shutdown; Query OK, 0 rows affected (0.01 sec) shell > ss -lntup |grep 3306
mycat端插入新的数据查看数据是否同步:
mysql -uroot -p -P 8066 -h 127.0.0.1 mysql> insert into temp values(4,'ddd'); Query OK, 1 row affected (0.07 sec)
node1 slave端查看数据是否同步:
mysql -uroot -p -P 3068 -h 127.0.0.1
select * from test.temp
node2 slave端查看数据是否同步:
mysql -uroot -p -P 3067 -h 127.0.0.1
select * from test.temp
发现因为node2的master端已经挂了,数据不能同步了.
数据访问是否正常:
mysql -uroot -p -P 8066 -h 127.0.0.1
select * from temp;
执行多次发现结果一样,说明在一台master端挂掉的情况下,其连接的slave端也被剔除,因此数据完整性可以保证.
4、配置myid.properties文件
-- wget http://nexus.mycat.io/content/groups/public/io/mycat/mycat/Mycat-web/1.0-SNAPSHOT/Mycat-web-1.0-20160617.083134-5-20160617163048-linux.tar.gz vi mycat-web/WEB-INF/classes/mycat.properties -- zookeeper=10.10.111.80:2181 sqlonline.server=10.10.111.2 sqlonline.user=root sqlonline.passwd=bnh1923 -- web访问:http://localhost:8082/mycat
5.配置rule.xml(略)
6.初始化zk配置: conf]# ../bin/init_zk_data.sh
7.启动mycat服务: conf]# ../bin/mycat/mycat start
8.多实例配置:
vim schema.xml -- <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema> <schema name="aone" checkSQLschema="false" sqlMaxLimit="100" dataNode="aone"/> <schema name="mtop" checkSQLschema="false" sqlMaxLimit="100" dataNode="mtop"/> <dataNode name="aone" dataHost="aone" database="aone"/> <dataNode name="mtop" dataHost="mtop" database="mtop"/> <dataHost name="aone" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select 1</heartbeat> <writeHost host="aone" url="192.168.1.220:3301" user="root" password="bnh1923"/> </dataHost> <dataHost name="mtop" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select 1</heartbeat> <writeHost host="mtop" url="192.168.1.220:3302" user="root" password="bnh1923"/> </dataHost> </mycat:schema> -- vim server.xml -- <user name="aone"> <property name="password">bnh1923</property> <property name="schemas">aone</property> </user> <user name="mtop"> <property name="password">bnh1923</property> <property name="schemas">mtop</property> </user> --
ZooKeeper部署管理Mycat
ZooKeeper 是一个面向分布式系统的构建块。当设计一个分布式系统时,一般需要设计和开发一些协调服务:
名称服务— 名称服务是将一个名称映射到与该名称有关联的一些信息的服务。电话目录是将人的名字映射到其电话号码的一个名称服务。同样,DNS 服务也是一个名称服务,它将一个域名映射到一个 IP 地址。在分布式系统中,您可能想跟踪哪些服务器或服务在运行,并通过名称查看其状态。ZooKeeper 暴露了一个简单的接口来完成此工作。也可以将名称服务扩展到组成员服务,这样就可以获得与正在查找其名称的实体有关联的组的信息。
锁定— 为了允许在分布式系统中对共享资源进行有序的访问,可能需要实现分布式互斥(distributed mutexes)。ZooKeeper 提供一种简单的方式来实现它们。
同步— 与互斥同时出现的是同步访问共享资源的需求。无论是实现一个生产者-消费者队列,还是实现一个障碍,ZooKeeper 都提供一个简单的接口来实现该操作。
配置管理— 您可以使用 ZooKeeper 集中存储和管理分布式系统的配置。这意味着,所有新加入的节点都将在加入系统后就可以立即使用来自 ZooKeeper 的最新集中式配置。这还允许您通过其中一个 ZooKeeper 客户端更改集中式配置,集中地更改分布式系统的状态。
领导者选举— 分布式系统可能必须处理节点停机的问题,您可能想实现一个自动故障转移策略。ZooKeeper 通过领导者选举对此提供现成的支持。



系统:CentOS7.3
jdk版本:1.7
zookeeper版本:3.4.10
mycat版本:1.6
| hostname | IP | myid |
|---|---|---|
| testA | 192.168.33.11 | 1 |
| testB | 192.168.33.12 | 2 |
| testC | 192.168.33.13 | 3 |
为了测试方便,这里关闭系统防火墙和禁用selinux,生产环境防火墙则需要开放zookeeper相关端口,2181、2888、3888。
先在testA节点安装,再同步到其它2个节点。
mkdir -p /data/packages/ cd /data/packages/ wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz cd /usr/local/ tar -zxvf /data/packages/zookeeper-3.4.10.tar.gz ln -s zookeeper-3.4.10 zookeeper cd zookeeper mkdir data log cd conf/ cp zoo_sample.cfg zoo.cfg
修改配置文件 vim zoo.cfg
# The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/usr/local/zookeeper/data dataLogDir=/usr/local/zookeeper/log # the port at which the clients will connect clientPort=2181 server.1=192.168.33.11:2888:3888 server.2=192.168.33.12:2888:3888 server.3=192.168.33.13:2888:3888 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1
添加myid文件, 同步zookeeper目录到其它2个节点,修改myid:
1 2 3 | vim /usr/local/zookeeper/data/myid 写入 1 rsync -avzP /usr/local/zookeeper/ root@192.168.33.12:/usr/local/zookeeper/ rsync -avzP /usr/local/zookeeper/ root@192.168.33.13:/usr/local/zookeeper/ vi /usr/local/zookeeper/data/myid 写入 1 vi /usr/local/zookeeper/data/myid 写入 1 |
启动zookeeper:cd /usr/local/zookeeper/bin/
3个节点Mycat都执行mycat初始化数据:
sh /usr/local/mycat/bin/init_zk_data.sh
配置mycat支持zookeeper:
vim /usr/local/mycat/conf/myid.properties
loadZk=true # zk集群地址,多个用","隔开 zkURL=127.0.0.1:2181 # zk集群内Mycat集群ID clusterId=mycat-cluster-1 # Mycat集群内本实例ID,禁止重复 myid=mycat_fz_01 # Mycat集群内节点个数 clusterSize=3 clusterNodes=mycat_fz_01,mycat_fz_02,mycat_fz_03 #server booster ; booster install on db same server,will reset all minCon to 1 type=server boosterDataHosts=dataHost1
用zookeeper配置mycat:
使用ZooInspector工具管理ZooKeeper,以下是连接zookeeper方法。

连接成功后,可看到mycat集群的配置.

修改相应配置

启动mycat后,mycat配置文件会自动更新。

注意事项:
* loadZk必须改为true才生效
* zkURL的地址是多个中间用“,”隔开
* clusterId,同一个zk内的集群ID必须唯一
* Myid:本实例的id在当前的mycat集群内ID唯一
* 配置完zk并启动mycat后,会更新本地conf下的相关配置文件。
https://blog.csdn.net/ygqygq2/article/details/78292828