《mycat結(jié)合MySQL雙主實(shí)現(xiàn)讀寫分離》要點(diǎn):
本文介紹了mycat結(jié)合MySQL雙主實(shí)現(xiàn)讀寫分離,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
作者介紹
牛恒博,一線運(yùn)維人,擅長為中小企業(yè)快速實(shí)現(xiàn)運(yùn)維從無到有,再到自動(dòng)化.現(xiàn)就職于某醫(yī)療大數(shù)據(jù)公司.
groupadd mysql useradd -r -g mysql -s /bin/false mysql
yum install -y libaio cd /usr/local/src/ wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz tar -zxf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz cp -rf mysql-5.7.17-linux-glibc2.5-x86_64 /data/app/mysql-3306 cp -rf mysql-5.7.17-linux-glibc2.5-x86_64 /data/app/mysql-3307 chown -R mysql:mysql /data/app/mysql-3306 chown -R mysql:mysql /data/app/mysql-3307 /data/app/mysql-3306/bin/mysqld --initialize-insecure --user=mysql --basedir=/data/app/mysql-3306 --datadir=/data/app/mysql-3306/data /data/app/mysql-3307/bin/mysqld --initialize-insecure --user=mysql --basedir=/data/app/mysql-3307 --datadir=/data/app/mysql-3307/data
需要修改的參數(shù):?
cat > /data/app/mysql-3306/my.cnf<<EOF [client] port = 3306 socket = /data/app/mysql-3306/mysql.sock [mysqld] port = 3306 user = mysql server-id = 1 bind-address = 0.0.0.0 basedir = /data/app/mysql-3306 datadir = /data/app/mysql-3306/data socket = /data/app/mysql-3306/mysql.sock pid-file = /data/app/mysql-3306/mysql.pid log-error = /data/app/mysql-3306/mysqld.log skip-name-resolve log_bin = mysql-bin log-slave-updates auto-increment-increment = 2 auto-increment-offset = 1 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES EOF chown mysql.mysql /data/app/mysql-3306/my.cnf
cat > /data/app/mysql-3307/my.cnf<<EOF [client] port = 3307 socket = /data/app/mysql-3307/mysql.sock [mysqld] port = 3307 user = mysql server-id = 11 bind-address = 0.0.0.0 basedir = /data/app/mysql-3307 datadir = /data/app/mysql-3307/data socket = /data/app/mysql-3307/mysql.sock pid-file = /data/app/mysql-3307/mysql.pid log-error = /data/app/mysql-3307/mysqld.log skip-name-resolve log_bin = mysql-bin sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES EOF chown mysql.mysql /data/app/mysql-3307/my.cnf
cat > /data/app/mysql-3306/my.cnf<<EOF [client] port = 3306 socket = /data/app/mysql-3306/mysql.sock [mysqld] port = 3306 user = mysql server-id = 2 bind-address = 0.0.0.0 basedir = /data/app/mysql-3306 datadir = /data/app/mysql-3306/data socket = /data/app/mysql-3306/mysql.sock pid-file = /data/app/mysql-3306/mysql.pid log-error = /data/app/mysql-3306/mysqld.log skip-name-resolve log_bin = mysql-bin log-slave-updates auto-increment-increment = 2 auto-increment-offset = 2 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES EOF chown mysql.mysql /data/app/mysql-3306/my.cnf
cat > /data/app/mysql-3307/my.cnf<<EOF [client] port = 3307 socket = /data/app/mysql-3307/mysql.sock [mysqld] port = 3307 user = mysql server-id = 22 bind-address = 0.0.0.0 basedir = /data/app/mysql-3307 datadir = /data/app/mysql-3307/data socket = /data/app/mysql-3307/mysql.sock pid-file = /data/app/mysql-3307/mysql.pid log-error = /data/app/mysql-3307/mysqld.log skip-name-resolve log_bin = mysql-bin sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES EOF chown mysql.mysql /data/app/mysql-3307/my.cnf
linux-node2和linux-node3都執(zhí)行如下命令
touch /data/app/mysql-3306/mysqld.log && chown mysql.mysql /data/app/mysql-3306/mysqld.log sed -i 's#/usr/local/mysql#/data/app/mysql-3306#g' /data/app/mysql-3306/bin/mysqld_safe /data/app/mysql-3306/bin/mysqld_safe --defaults-file=/data/app/mysql-3306/my.cnf --basedir=/data/app/mysql-3306 --datadir=/data/app/mysql-3306/data --user=mysql & touch /data/app/mysql-3307/mysqld.log && chown mysql.mysql /data/app/mysql-3307/mysqld.log sed -i 's#/usr/local/mysql#/data/app/mysql-3307#g' /data/app/mysql-3307/bin/mysqld_safe /data/app/mysql-3307/bin/mysqld_safe --defaults-file=/data/app/mysql-3307/my.cnf --basedir=/data/app/mysql-3307 --datadir=/data/app/mysql-3307/data --user=mysql &
ss -lntup |egrep '3306|3307' tcp ? ?LISTEN ? ? 0 ? ? ?80 ? ? ? ? ? ? ? ? ? ? *:3306 ? ? ? ? ? ? ? ? ?*:* ? ? ?users:(("mysqld",19973,22)) tcp ? ?LISTEN ? ? 0 ? ? ?80 ? ? ? ? ? ? ? ? ? ? *:3307 ? ? ? ? ? ? ? ? ?*:* ? ? ?users:(("mysqld",20537,22))
cd /data/app/mysql-3306/ ./bin/mysql -uroot -p -S mysql.sock -P 3306 mysql> CREATE USER 'repl'@'192.%' IDENTIFIED BY 'mysql'; Query OK, 0 rows affected (0.05 sec) mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.%'; Query OK, 0 rows affected (0.00 sec) mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File ? ? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | ? ? ?613 | ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ? | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
cd /data/app/mysql-3307/ ./bin/mysql -uroot -p -S mysql.sock -P 3307 mysql> CHANGE MASTER TO MASTER_HOST='192.168.56.12', ? ?-> ? ? ? ? ? ? ? ? ?MASTER_PORT=3306, ? ?-> ? ? ? ? ? ? ? ? ?MASTER_USER='repl', ? ?-> ? ? ? ? ? ? ? ? ?MASTER_PASSWORD='mysql', ? ?-> ? ? ? ? ? ? ? ? ?MASTER_LOG_FILE='mysql-bin.000001', ? ?-> ? ? ? ? ? ? ? ? ?MASTER_LOG_POS=613; Query OK, 0 rows affected, 2 warnings (0.04 sec) mysql> start slave; Query OK, 0 rows affected (0.02 sec) mysql> show slave status\G *************************** 1. row *************************** ? ? ? ? ? ? ? Slave_IO_State: Waiting for master to send event ? ? ? ? ? ? ? ? ?Master_Host: 192.168.56.12 ? ? ? ? ? ? ? ? ?Master_User: repl ? ? ? ? ? ? ? ? ?Master_Port: 3306 ? ? ? ? ? ? ? ?Connect_Retry: 60 ? ? ? ? ? ? ?Master_Log_File: mysql-bin.000001 ? ? ? ? ?Read_Master_Log_Pos: 613 ? ? ? ? ? ? ? Relay_Log_File: linux-node2-relay-bin.000002 ? ? ? ? ? ? ? ?Relay_Log_Pos: 320 ? ? ? ?Relay_Master_Log_File: mysql-bin.000001 ? ? ? ? ? ? Slave_IO_Running: Yes ? ? ? ? ? ?Slave_SQL_Running: Yes
cd /data/app/mysql-3306/ ./bin/mysql -uroot -p -S mysql.sock -P 3306 mysql> CREATE USER 'repl'@'192.%' IDENTIFIED BY 'mysql'; Query OK, 0 rows affected (0.05 sec) mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.%'; Query OK, 0 rows affected (0.00 sec) mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File ? ? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | ? ? ?613 | ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ? | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
cd /data/app/mysql-3307/ ./bin/mysql -uroot -p -S mysql.sock -P 3307 mysql> CHANGE MASTER TO MASTER_HOST='192.168.56.13', ? ? ? ? ? ? ? ? MASTER_PORT=3306, ? ? ? ? ? ? ? ? MASTER_USER='repl', ? ? ? ? ? ? ? ? MASTER_PASSWORD='mysql', ? ? ? ? ? ? ? ? MASTER_LOG_FILE='mysql-bin.000001', ? ? ? ? ? ? ? ? MASTER_LOG_POS=613; Query OK, 0 rows affected, 2 warnings (0.04 sec) mysql> start slave; Query OK, 0 rows affected (0.02 sec) mysql> show slave status\G *************************** 1. row *************************** ? ? ? ? ? ? ? Slave_IO_State: Waiting for master to send event ? ? ? ? ? ? ? ? ?Master_Host: 192.168.56.13 ? ? ? ? ? ? ? ? ?Master_User: repl ? ? ? ? ? ? ? ? ?Master_Port: 3306 ? ? ? ? ? ? ? ?Connect_Retry: 60 ? ? ? ? ? ? ?Master_Log_File: mysql-bin.000001 ? ? ? ? ?Read_Master_Log_Pos: 613 ? ? ? ? ? ? ? Relay_Log_File: linux-node2-relay-bin.000002 ? ? ? ? ? ? ? ?Relay_Log_Pos: 320 ? ? ? ?Relay_Master_Log_File: mysql-bin.000001 ? ? ? ? ? ? Slave_IO_Running: Yes ? ? ? ? ? ?Slave_SQL_Running: Yes
d /data/app/mysql-3306/ ./bin/mysql -uroot -p -S mysql.sock -P 3306 mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File ? ? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | ? ? ?613 | ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ? | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
cd /data/app/mysql-3306/ ./bin/mysql -uroot -p -S mysql.sock -P 3306 mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File ? ? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | ? ? ?613 | ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ? | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
mysql> CHANGE MASTER TO MASTER_HOST='192.168.56.13', ? ? ? ? ? ? ? ? MASTER_PORT=3306, ? ? ? ? ? ? ? ? MASTER_USER='repl', ? ? ? ? ? ? ? ? MASTER_PASSWORD='mysql', ? ? ? ? ? ? ? ? MASTER_LOG_FILE='mysql-bin.000001', ? ? ? ? ? ? ? ? MASTER_LOG_POS=613; mysql> start slave; Query OK, 0 rows affected (0.03 sec) mysql> show slave status\G *************************** 1. row *************************** ? ? ? ? ? ? ? Slave_IO_State: Waiting for master to send event ? ? ? ? ? ? ? ? ?Master_Host: 192.168.56.13 ? ? ? ? ? ? ? ? ?Master_User: repl ? ? ? ? ? ? ? ? ?Master_Port: 3306 ? ? ? ? ? ? ? ?Connect_Retry: 60 ? ? ? ? ? ? ?Master_Log_File: mysql-bin.000001 ? ? ? ? ?Read_Master_Log_Pos: 613 ? ? ? ? ? ? ? Relay_Log_File: linux-node2-relay-bin.000002 ? ? ? ? ? ? ? ?Relay_Log_Pos: 320 ? ? ? ?Relay_Master_Log_File: mysql-bin.000001 ? ? ? ? ? ? Slave_IO_Running: Yes ? ? ? ? ? ?Slave_SQL_Running: Yes ? ? ? ?
mysql> CHANGE MASTER TO MASTER_HOST='192.168.56.12', ? ? ? ? ? ? ? ? MASTER_PORT=3306, ? ? ? ? ? ? ? ? MASTER_USER='repl', ? ? ? ? ? ? ? ? MASTER_PASSWORD='mysql', ? ? ? ? ? ? ? ? MASTER_LOG_FILE='mysql-bin.000001', ? ? ? ? ? ? ? ? MASTER_LOG_POS=613; mysql> start slave; Query OK, 0 rows affected (0.00 sec) mysql> mysql> show slave status\G *************************** 1. row *************************** ? ? ? ? ? ? ? Slave_IO_State: Waiting for master to send event ? ? ? ? ? ? ? ? ?Master_Host: 192.168.56.12 ? ? ? ? ? ? ? ? ?Master_User: repl ? ? ? ? ? ? ? ? ?Master_Port: 3306 ? ? ? ? ? ? ? ?Connect_Retry: 60 ? ? ? ? ? ? ?Master_Log_File: mysql-bin.000001 ? ? ? ? ?Read_Master_Log_Pos: 613 ? ? ? ? ? ? ? Relay_Log_File: linux-node3-relay-bin.000002 ? ? ? ? ? ? ? ?Relay_Log_Pos: 320 ? ? ? ?Relay_Master_Log_File: mysql-bin.000001 ? ? ? ? ? ? Slave_IO_Running: Yes ? ? ? ? ? ?Slave_SQL_Running: Yes
mysql> create database test; Query OK, 1 row affected (0.01 sec) mysql> use test; Database changed mysql> create table temp(id int,name varchar(64)); Query OK, 0 rows affected (0.11 sec) mysql> insert into temp values(1,'aaa'); Query OK, 1 row affected (0.28 sec) mysql> CREATE TABLE temp2(id INT PRIMARY KEY ?NOT NULL AUTO_INCREMENT ,nname VARCHAR(64)); Query OK, 0 rows affected (0.01 sec) mysql> insert into temp2(nname) values('bbb'); Query OK, 1 row affected (0.01 sec) mysql> select * from test.temp; +------+------+ | id ? | name | +------+------+ | ? ?1 | aaa ?| +------+------+ 1 row in set (0.01 sec)
在linux-node2 slave上查看數(shù)據(jù)
mysql> select * from test.temp; +------+------+ | id ? | name | +------+------+ | ? ?1 | aaa ?| +------+------+ 1 row in set (0.00 sec)
mysql> select * from test.temp; +------+------+ | id ? | name | +------+------+ | ? ?1 | aaa ?| +------+------+ 1 row in set (0.00 sec)
mysql> select * from test.temp; +------+------+ | id ? | name | +------+------+ | ? ?1 | aaa ?| +------+------+ 1 row in set (0.00 sec)
mysql> use test; mysql> insert into temp2(nname) values('ddd'); Query OK, 1 row affected (0.02 sec) mysql> ?insert into temp2(nname) values('fff'); Query OK, 1 row affected (0.00 sec) mysql> select * from test.temp2; +----+-------+ | id | nname | +----+-------+ | ?1 | bbb ? | | ?2 | ddd ? | | ?4 | fff ? | +----+-------+
mysql> select * from test.temp2; +----+-------+ | id | nname | +----+-------+ | ?1 | bbb ? | | ?2 | ddd ? | | ?4 | fff ? | +----+-------+ 3 rows in set (0.00 sec)
mysql> select * from test.temp2; +----+-------+ | id | nname | +----+-------+ | ?1 | bbb ? | | ?2 | ddd ? | | ?4 | fff ? | +----+-------+ 3 rows in set (0.00 sec)
mysql> select * from test.temp2; +----+-------+ | id | nname | +----+-------+ | ?1 | bbb ? | | ?2 | ddd ? | | ?4 | fff ? | +----+-------+ 3 rows in set (0.00 sec)
cd /usr/local/src 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 /data/app/mycat-1.6 ln -s /data/app/mycat-1.6 /data/app/mycat
schema.xml
balance="1"
writeType="0"
switchType="1"
cd /data/app/mycat cp conf/schema.xml conf/schema.xml.bak cat > conf/schema.xml <<EOF <?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="192.168.56.12:3306" user="root" password="mysql"> ? ? ? ? ? ?<readHost host="slave2" url="192.168.56.13:3307" 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> EOF
./bin/mycat start ss -lntup |egrep ?'(8066|9066)' ? tcp ? ?LISTEN ? ? 0 ? ? ?100 ? ? ? ? ? ? ? ? ? :::8066 ? ? ? ? ? ? ? ? :::* ? ? ?users:(("java",16546,79)) tcp ? ?LISTEN ? ? 0 ? ? ?100 ? ? ? ? ? ? ? ? ? :::9066 ? ? ? ? ? ? ? ? :::* ? ? ?users:(("java",16546,75))
mysql> GRANT ALL PRIVILEGES ON *.* TO root@'192.%' IDENTIFIED BY 'mysql'; Query OK, 0 rows affected, 1 warning (0.07 sec
步驟省略,詳細(xì)內(nèi)容可以參考上面的MySQL安裝
cd /data/app/mysql/ ./bin/mysql -uroot -p -P 8066 -h 192.168.56.11 ##連接mycat,初始密碼123456 mysql> show databases; +----------+ | DATABASE | +----------+ | TESTDB ? | +----------+ 1 row in set (0.00 sec) mysql> use TESTDB; mysql> insert into temp2(nname) values('eee'); Query OK, 1 row affected (0.09 sec) mysql> insert into temp2(nname) values('ggg'); Query OK, 1 row affected (0.01 sec)
mysql> select * from test.temp2; +----+-------+ | id | nname | +----+-------+ | ?1 | bbb ? | | ?2 | ddd ? | | ?4 | fff ? | | ?5 | eee ? | | ?7 | ggg ? | +----+-------+ 5 rows in set (0.00 sec)
結(jié)果發(fā)現(xiàn)數(shù)據(jù)寫入到了linux-node2 slave端
mysql> shutdown; Query OK, 0 rows affected (0.01 sec) shell > ss -lntup |grep 3306
mysql> insert into temp2(nname) values('mmmm'); Query OK, 1 row affected (0.07 sec) mysql> insert into temp2(nname) values('nnnn'); Query OK, 1 row affected (0.01 sec)
mysql> select * from test.temp2; +----+-------+ | id | nname | +----+-------+ | ?1 | bbb ? | | ?2 | ddd ? | | ?4 | fff ? | | ?5 | eee ? | | ?7 | ggg ? | | ?8 | mmmm ?| | 10 | nnnn ?| +----+-------+ 7 rows in set (0.00 sec)
mysql> select * from test.temp2; +----+-------+ | id | nname | +----+-------+ | ?1 | bbb ? | | ?2 | ddd ? | | ?4 | fff ? | | ?5 | eee ? | | ?7 | ggg ? | +----+-------+ 5 rows in set (0.00 sec)
發(fā)現(xiàn)因?yàn)閘inux-node2的master端已經(jīng)掛了,數(shù)據(jù)不能同步了
登錄到mycat服務(wù)器上執(zhí)行如下命令:
mysql> select * from temp2; +----+-------+ | id | nname | +----+-------+ | ?1 | bbb ? | | ?2 | ddd ? | | ?4 | fff ? | | ?5 | eee ? | | ?7 | ggg ? | | ?8 | mmmm ?| | 10 | nnnn ?| +----+-------+ 7 rows in set (0.00 sec)
執(zhí)行多次發(fā)現(xiàn)結(jié)果一樣,說明在一臺(tái)master端掛掉的情況下,其連接的slave端也被剔除,因此數(shù)據(jù)完整性可以保證
第一次配置的時(shí)候maser端沒有配置log-slave-updates
,導(dǎo)致node3-slave上沒有node2-master端的數(shù)據(jù).
解釋:
從庫開啟log-bin參數(shù),如果直接往從庫寫數(shù)據(jù),是可以記錄log-bin日志的,但是從庫通過I0線程讀取主庫二進(jìn)制日志文件,然后通過SQL線程寫入的數(shù)據(jù),是不會(huì)記錄binlog日志的.也就是說從庫從主庫上復(fù)制的數(shù)據(jù),是不寫入從庫的binlog日志的.所以從庫做為其他從庫的主庫時(shí)需要在配置文件中添加log-slave-updates參數(shù).
解決辦法:
[mysqld] log-slave-updates
文章來自微信公眾號(hào):
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/2385.html