mycat学习01-- mycat我带你入门
admin
2023-04-27 21:23:15
0

请耐心读完整篇文章,过程中出现的错误点在文章结尾都有总结和解决办法。

服务器架构


mycat学习01-- mycat我带你入门

mycat学习01-- mycat我带你入门

安装MySQL

创建mysql用户

groupadd mysql

useradd -r -g mysql -s /bin/false mysql

安装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

修改my.cnf

需要修改的参数: 

·        server-id:保证每个配置文件唯一

·        两台master的自增长ID必须不同

linux-node2

master

cat > /data/app/mysql-3306/my.cnf<

[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

slave

cat > /data/app/mysql-3307/my.cnf<

[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

linux-node3

master

cat > /data/app/mysql-3306/my.cnf<

[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

slave

cat > /data/app/mysql-3307/my.cnf<

[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

启动MySQL

启动服务

linux-node2linux-node3都执行如下命令

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))

配置双主

配置主从

linux-node2

master

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)

slave

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

linux-node3

master

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)

slave

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

配置双主

masterbinlog位置

linux-node2 master

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)

linux-node3 master

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)

linux-node2 master配置跟linux-node3 master同步

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        

linux-node3 master配置跟linux-node2 master同步

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

验证

linux-node2上验证

linux-node2 master上创建数据

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上查看数据

mysql> select * from test.temp;

+------+------+

| id   | name |

+------+------+

|    1 | aaa  |

+------+------+

1 row in set (0.00 sec)

linux-node3 master上查看数据

mysql> select * from test.temp;

+------+------+

| id   | name |

+------+------+

|    1 | aaa  |

+------+------+

1 row in set (0.00 sec)

linux-node3 slave上查看数据

mysql> select * from test.temp;

+------+------+

| id   | name |

+------+------+

|    1 | aaa  |

+------+------+

1 row in set (0.00 sec)

linux-node3上验证

linux-node3 master上创建数据

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   |

+----+-------+

linux-node3 slave上查看数据

mysql> select * from test.temp2;

+----+-------+

| id | nname |

+----+-------+

|  1 | bbb   |

|  2 | ddd   |

|  4 | fff   |

+----+-------+

3 rows in set (0.00 sec)

linux-node2 master上查看数据

mysql> select * from test.temp2;

+----+-------+

| id | nname |

+----+-------+

|  1 | bbb   |

|  2 | ddd   |

|  4 | fff   |

+----+-------+

3 rows in set (0.00 sec)

linux-node2 slave上查看数据

mysql> select * from test.temp2;

+----+-------+

| id | nname |

+----+-------+

|  1 | bbb   |

|  2 | ddd   |

|  4 | fff   |

+----+-------+

3 rows in set (0.00 sec)

结论

·        在任意一个master端更新数据,其他任意端都可以更新数据

·        两台服务器配置了间隔自增长,数据不同冲突

linux-node1上安装mycat

安装mycat

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"
全部的readHoststand by writeHost参与select语句的负载均衡

·        writeType="0"
所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后以切换后的为准,切换记录在配置文件中:dnindex.properties

·        switchType="1"
默认值为1,自动切换

cd /data/app/mycat

cp conf/schema.xml conf/schema.xml.bak

cat > conf/schema.xml <

    

    

        select user()

        

            

        

        

            

        

    

EOF

启动mycat

./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))

验证mycat服务是否正常

linux-node2-master端配置mycat连接账号

mysql> GRANT ALL PRIVILEGES ON *.* TO root@'192.%' IDENTIFIED BY 'mysql';

Query OK, 0 rows affected, 1 warning (0.07 sec

mycat服务器上安装mysql服务,但是不启动

步骤省略,详细内容可以参考上面的MySQL安装

使用mysql的客户端连接mycat

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)

linux-node3 slave端查看数据是否同步

mysql> select * from test.temp2;

+----+-------+

| id | nname |

+----+-------+

|  1 | bbb   |

|  2 | ddd   |

|  4 | fff   |

|  5 | eee   |

|  7 | ggg   |

+----+-------+

5 rows in set (0.00 sec)

结果发现数据写入到了linux-node2 slave

测试

服务自动迁移

关闭linux-node2 masterMySQL服务

mysql> shutdown;

Query OK, 0 rows affected (0.01 sec)

 

shell > ss -lntup |grep 3306

mycat端插入新的数据查看数据是否同步

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)

linux-node3 slave端查看数据是否同步

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)

linux-node2 slave端查看数据是否同步

mysql> select * from test.temp2;

+----+-------+

| id | nname |

+----+-------+

|  1 | bbb   |

|  2 | ddd   |

|  4 | fff   |

|  5 | eee   |

|  7 | ggg   |

+----+-------+

5 rows in set (0.00 sec)

 发现因为linux-node2master端已经挂了,数据不能同步了

数据访问是否正常

登录到mycat服务器上执行如下命令:

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)

执行多次发现结果一样,说明在一台master端挂掉的情况下,其连接的slave端也被剔除,因此数据完整性可以保证

故障汇总

第一次配置的时候maser端没有配置log-slave-updates,导致node3-slave上没有node2-master端的数据。
解释:
从库开启log-bin参数,如果直接往从库写数据,是可以记录log-bin日志的,但是从库通过I0线程读取主库二进制日志文件,然后通过SQL线程写入的数据,是不会记录binlog日志的。也就是说从库从主库上复制的数据,是不写入从库的binlog日志的。所以从库做为其他从库的主库时需要在配置文件中添加log-slave-updates参数。

解决办法:

[mysqld]

log-slave-updates


相关内容

热门资讯

烈焰熊熊,堪比“原子弹”,欧洲... 据美国有线电视新闻网(CNN)7月29日报道,席卷法国西南部的大片野火燃烧得如此猛烈,以至于形成了一...
外交部:对日本熊本县地震遇难者... 据凤凰卫视报道,针对日本熊本县发生强震造成人员伤亡,中国外交部发言人毛宁7月29日在例行记者会上表示...
高铁喧哗被劝阻后叫嚣全家体制内... “女子高铁喧哗被劝阻后叫嚣全家体制内”一事迎来官方通报。据新京报报道,7月29日,辽宁北票市公安局发...
广东专业蓝牙耳机定制厂家推荐,... 在珠三角腹地,广东早已成为全球蓝牙耳机产业链的“心脏地带”。从深圳华强北的声学元件批发,到东莞、惠州...
格雷厄姆葬礼变地缘竞价场!两大... 有些葬礼,送别的是逝者;有些葬礼,演的却是活人最现实的政治博弈。当地时间7月28日,美国老牌鹰派参议...
一道小学数学题难住3名医学博士... 3名不同学校的博士同做一道数学题,谁最厉害?近日,一陕西网友发布的视频引发热议。29日,视频发布者“...
华为全新“小艺任务”亮相:整合... 7月29日,在华为鸿蒙电脑新品技术沟通会上,终端云服务小艺业务部总裁贾永利宣布,小艺将迎来“从对话到...
广西日报特稿《王的猜想》火了,... 澎湃新闻记者 蒋子文 实习生 汤煜炜为应对外界购买纸质版特稿《王的猜想》的热情,《广西日报》宣布紧急...
月租20元内!2026年平价云... 不少手游玩家、账号运营从业者挑选云手机时,首要诉求就是低价够用,想要控制每月支出在20元以内,同时兼...
诺奖得主如何看待王虹境遇?“我... 中村修二(2014年诺贝尔物理学奖得主)【导读】近日王虹与邓煜双双获得2026年菲尔兹奖,成为了首批...