mysql主从及mysql-proxy和mycat部署
一、mysql主从复制
1、mysql主从出现的原因
MYSQL主从复制集群在中小企业、大型企业中被广泛使用,MYSQL主从复制的目的是实现数据库冗余备份,将Master数据库数据定时同步至Slave库中,一旦Master数据库宕机,可以将WEB应用数据库配置快速切换至Slave数据库,确保WEB应用较高的可用率。
2、mysql主从的原理
Mysql主从复制集群至少需要2台数据库服务器,其中一台为Master库,另外一台为Slave库,MYSQL主从数据同步是一个异步复制的过程,要实现复制首先需要在master上开启bin-log日志功能,bin-log日志用于记录在Master库中执行的增、删、修改、更新操作的sql语句,整个过程需要开启3个线程,分别是Master开启IO线程,Slave开启IO线程和SQL线程,具体主从同步原理详解如下:
Slave上执行slave start,Slave IO线程会通过在Master创建的授权用户连接上至Master,并请求master从指定的bin-log文件和position位置之后发送bin-log日志内容;
Master接收到来自slave IO线程的请求后,master IO线程根据slave发送的指定bin-log日志position点之后的内容,然后返回给slave的IO线程。
返回的信息中除了bin-log日志内容外,还有master最新的binlog文件名以及在binlog中的下一个指定更新position点;
Slave IO线程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和position点记录到master.info文件中,以便在下一次读取的时候能告知master从响应的bin-log文件名及最后一个position点开始发起请求;
Slave Sql线程检测到relay-log中内容有更新,会立刻解析relay-log的内容成在Master真实执行时候的那些可执行的SQL语句,将解析的SQL语句并在Slave里执行,执行成功后,Master库与Slave库保持数据一致。
3、mysql主从复制部署
3.1实验环境
mysql master服务器:10.0.0.5
mysql slave 服务器:10.0.0.6
mysql使用mariadb
3.2mysql主从部署步骤
①在master和slave服务器上安装mariadb数据库
yum install -y mariadb mariadb-server mariadb-devel
[root@web04 ~]# rpm -qa mariadb mariadb-server mariadb-devel
mariadb-server-5.5.64-1.el7.x86_64
mariadb-5.5.64-1.el7.x86_64
mariadb-devel-5.5.64-1.el7.x86_64
[root@web04 ~]#
②启动mariadb数据库
[root@web03 ~]# systemctl restart mariadb
[root@web03 ~]# ps -ef |grep mysql
mysql 20439 1 0 08:43 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql 20601 20439 7 08:43 ? 00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root 20652 18956 0 08:43 pts/1 00:00:00 grep --color=auto mysql
③在master和slave上开启bin-log日志并配置server-id
[mysqld]
#server-id master和slave要不一样
server-id 5
#binlog日志的名称和位子可以直接定义
log-bin=/var/lib/mysql-bin
#binlog日志的格式
binlog_format = row
master
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-bin=/var/lib/mysql/mysql_master-bin
binlog_format = row
server-id=5
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
slave
[mysqld] server-id=6 log-bin=/var/lib/mysql/mysql_slave-bin binlog_format = row datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used. # If you need to run mysqld under a different user or group, # customize your systemd unit file for mariadb according to the # instructions in http://fedoraproject.org/wiki/Systemd [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid # # include all files from the config directory # !includedir /etc/my.cnf.d
④重启mariadb服务,查看二进制日志是否开启
systemctl restart mariadb
MariaDB [(none)]> show variables like "%log_bin"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin | ON | | sql_log_bin | ON | +---------------+-------+ 2 rows in set (0.00 sec)
⑤授权从库登陆
在master上授权,该步骤是在10.0.0.5上操作
MariaDB [(none)]> grant replication slave on *.* to tongbu@"10.0.0.%" identified by "123456"; Query OK, 0 rows affected (0.00 sec)
⑥查看master的log-file文件和Position节点信息
在master上查看,该步骤是在10.0.0.5上操作
MariaDB [(none)]> show master status; +-------------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------------+----------+--------------+------------------+ | mysql_master-bin.000001 | 394 | | | +-------------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
⑦配置slave服务器,该步骤在10.0.0.6上操作
MariaDB [(none)]> change master to master_host="10.0.0.5", #master的ip master_user="tongbu", #master上授权同步的用户名 master_password="123456",##master上授权同步的密码 master_log_file=" mysql_master-bin.000001", #master的log-file文件 master_log_pos=394;# Position节点位子 #可以在slave上使用help change master来查看内容
MariaDB [(none)]> change master to -> master_host='10.0.0.5', -> master_user='tongbu', -> master_password='123456', -> master_log_file='mysql_master-bin.000001', -> master_log_pos=544; Query OK, 0 rows affected (0.11 sec)
⑧在slave端开启slave进程
mysql5.5:slave start mysql 5.7:start slave
MariaDB [(none)]> slave start; Query OK, 0 rows affected (0.00 sec)
⑨测试主从
检查slave端是否有两个yes
show slave status\G;
MariaDB [(none)]> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.0.0.5 Master_User: tongbu Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql_master-bin.000001 Read_Master_Log_Pos: 544 Relay_Log_File: mariadb-relay-bin.000002 Relay_Log_Pos: 536 Relay_Master_Log_File: mysql_master-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 544 Relay_Log_Space: 832 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 5 1 row in set (0.00 sec) ERROR: No query specified
看到下面的两个yes,说明主从配置完成并且正常 Slave_IO_Running: Yes Slave_SQL_Running: Yes
Show slave status\G,常见参数含义解析:
Slave_IO_State I/O线程连接Master状态; Master_User 用于连接Master的用户; Master_Port Master端监听端口; Connect_Retry 主从连接失败,重试时间间隔; Master_Log_File I/O线程读取的Master二进制日志文件的名称。 Read_Master_Log_Pos I/O线程已读取的Master二进制日志文件的位置; Relay_Log_File SQL线程读取和执行的中继日志文件的名称。 Relay_Log_Pos SQL线程已读取和执行的中继日志文件的位置; Relay_Master_Log_File SQL线程执行的Master二进制日志文件的名称; Slave_IO_Running I/O线程是否被启动并成功地连接到主服务器上; Slave_SQL_Running SQL线程是否被启动; Replicate_Do_DB 指定的同步的数据库列表; Skip_Counter SQL_SLAVE_SKIP_COUNTER设置的值; Seconds_Behind_Master Slave端SQL线程和I/O线程之间的时间差距,单位为秒,常被用于主从延迟检查方法之一。
⑩测试
先查看slave的数据库信息
MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.00 sec) MariaDB [(none)]>
在master上创建一个新的数据库
MariaDB [(none)]> create database if not exists ywx default character set utf8; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | ywx | +--------------------+ 5 rows in set (0.00 sec)
在slave上查看master上新创建的库
MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | ywx | +--------------------+ 5 rows in set (0.00 sec)
数据库已经同步过来了
4、主从复制常见的故障
Slave_IO_Running: Connecting # 第一种:主库宕机 # 第二种:从库指定的用户名与密码错误(与主库授权的用户名和密码不一致) # 第三种:关闭防火墙 Slave_IO_Running: No # 从库指定的二进制文件有误 Slave_SQL_Running: No # pos点问题
二、mysql读写分离
1、什么是mysql的读写分离
MYSQL读写分离的原理其实就是让Master数据库处理事务性增、删除、修改、更新操作(CREATE、 INSERT、UPDATE、DELETE),而让Slave数据库处理SELECT操作,MYSQL读写分离前提是基于 MYSQL主从复制,这样可以保证在Master上修改数据,Slave同步之后,WEB应用可以读取到Slave端 的数据。
2、怎样实现读写分离
实现MYSQL读写分离可以基于第三方插件,也可以通过开发修改代码实现,具体实现的读写分离的常见 方式有如下四种: Amoeba读写分离; MySQL-Proxy读写分离; Mycat读写分离; 基于程序读写分离(效率很高,实施难度大,开发改代码); Amoeba是阿里08年开源的以MySQL为底层数据存储,并对WEB、APP应用提供MySQL协议接口的 proxy。它集中地响应WEB应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上 执行,基于此可以实现负载均衡、读写分离、高可用性等需求。 Mysql-Proxy是MySQL官方提供的mysql中间件服务,支持无数客户端连接,同时后端可连接若干台 Mysql-Server服务器,MYSQL-Proxy自身基于MySQL协议,连接MYSQL-Proxy的客户端无需修改任何 设置, 跟正常连接MYSQL Server没有区别,无需修改程序代码。现在由mysql-route替代。 Mycat是基于阿里12年开源的cobar开发的一个数据库中间件,在架构体系中是位于数据库和应用层之 间的一个组件,并且对于应用层是透明的,它可实现读写分离,分库分表。
3、实验部署环境
mysql-proxy(mycat):10.0.0.240 mysql-master:10.0.0.6 mysql-slave:10.0.0.5
4、mysql-proxy读写分离部署
4.1、部署主从复制
部署master和slave的主从辅助(省略)
详见mysql主从复制
4.2、部署mysql-proxy
①下载解压并移动mysql-proxy包
mkdir -p /server/tools cd /server/tools # 下载mysql-proxy: wget -c http://mirrors.163.com/mysql/Downloads/MySQL-Proxy/mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz # 解压: tar -xf mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz mv mysql-proxy-0.8.4-linux-el6-x86-64bit /usr/local/mysql-proxy # 配置环境变量: echo "export PATH=/usr/local/mysql-proxy/bin:$PATH" > /etc/profile.d/mysql-proxy.sh source /etc/profile.d/mysql-proxy.sh
②启动MYSQL-Proxy中间件
#创建mysql-proxy用户 useradd -r mysql-proxy #启动mysql-proxy mysql-proxy --daemon --log-level=debug --user=mysql-proxy --keepalive --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="10.0.0.5:3306" --proxy-read-only-backend-addresses="10.0.0.6:3306" --proxy-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua" --plugins=admin --admin-username="admin" --admin-password="admin" --admin-lua-script="/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua"
[root@yum tools]# netstat -anlp|grep 40 tcp 0 0 0.0.0.0:4040 0.0.0.0:* LISTEN 82264/mysql-proxy tcp 0 0 0.0.0.0:4041 0.0.0.0:* LISTEN 82264/mysql-proxy #4040为数据传输接口,4041为管理接口
# Mysql-Proxy的相关参数详解如下: --help-all :获取全部帮助信息; --proxy-address=host:port :代理服务监听的地址和端口,默认为4040; --admin-address=host:port :管理模块监听的地址和端口,默认为4041; --proxy-backend-addresses=host:port :后端mysql服务器的地址和端口; --proxy-read-only-backend-addresses=host:port :后端只读mysql服务器的地址和端口; --proxy-lua-script=file_name :完成mysql代理功能的Lua脚本; --daemon :以守护进程模式启动mysql-proxy; --keepalive :在mysql-proxy崩溃时尝试重启之; --log-file=/path/to/log_file_name :日志文件名称; --log-level=level :日志级别; --log-use-syslog :基于syslog记录日志; --plugins=plugin :在mysql-proxy启动时加载的插件; --user=user_name :运行mysql-proxy进程的用户; --defaults-file=/path/to/conf_file_name :默认使用的配置文件路径,其配置段使用[mysqlproxy]标识; --proxy-skip-profiling :禁用profile; --pid-file=/path/to/pid_file_name :进程文件名;
③在master和slave上授权proxy
因为master和proxy为主从配置,只需要在master上授权proxy即可,slave会自动的同步master上的授权操作
在master上操作
grant all on *.* to mysql-proxy@"10.0.0.%" identified by '123456';
在master查看proxy授权信息
MariaDB [(none)]> select user,host from mysql.user; +-------------+-----------+ | user | host | +-------------+-----------+ | mysql-proxy | 10.0.0.% | | tongbu | 10.0.0.% | | root | 127.0.0.1 | | root | ::1 | | | localhost | | root | localhost | | | web03 | | root | web03 | +-------------+-----------+ 8 rows in set (0.01 sec)
在slave端查看proxy授权信息
MariaDB [(none)]> select user,host from mysql.user; +-------------+-----------+ | user | host | +-------------+-----------+ | mysql-proxy | 10.0.0.% | | root | 127.0.0.1 | | root | ::1 | | | localhost | | root | localhost | | | web04 | | root | web04 | +-------------+-----------+ 7 rows in set (0.00 sec)
④登陆mysql-proxy4041管理接口,查看读写分离的状态
在mysql-proxy上操作
登陆mysql-proxy的管理地址
[root@yum yum.repos.d]# mysql -h10.0.0.240 -uadmin -padmin -P4041 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.0.99-agent-admin Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]>
查看后端master和slave数据库的状态信息
[root@yum ~]# mysql -h10.0.0.240 -uadmin -padmin -P4041 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.0.99-agent-admin Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> select * from backends; +-------------+---------------+---------+------+------+-------------------+ | backend_ndx | address | state | type | uuid | connected_clients | +-------------+---------------+---------+------+------+-------------------+ | 1 | 10.0.0.5:3306 | unknown | rw | NULL | 0 | | 2 | 10.0.0.6:3306 | unknown | ro | NULL | 0 | +-------------+---------------+---------+------+------+-------------------+ 2 rows in set (0.00 sec)
因为还没有读写过数据库,所有state为unknow。
⑤通过mysql-proxy创建数据
通过4040代理端口插入数据,该sql语句会走master,于是可以激活master状态:
mysql -h 10.0.0.240 -umysql-proxy -p123456 -P4040;
[root@yum ~]# mysql -h10.0.0.240 -umysql-proxy -p123456 -P4040 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 7 Server version: 5.5.64-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> create database king default character set utf8; Query OK, 1 row affected (0.00 sec)
通过4041代理端口查看后端master库的状态为up
mysql -h 10.0.0.240 -uadmin -padmin -P4041;
MySQL [(none)]> select * from backends; +-------------+---------------+---------+------+------+-------------------+ | backend_ndx | address | state | type | uuid | connected_clients | +-------------+---------------+---------+------+------+-------------------+ | 1 | 10.0.0.5:3306 | up | rw | NULL | 0 | | 2 | 10.0.0.6:3306 | unknown | ro | NULL | 0 | +-------------+---------------+---------+------+------+-------------------+ 2 rows in set (0.00 sec)
⑥通过mysql-proxy查询数据
通过4040代理端口查询数据,该sql语句会走slave,于是可以激活slave状态:
mysql -h 10.0.0.240 -umysql-proxy -p123456 -P4040;
先创建ywx库的t1表
create database ywx; use ywx; create table t1(id int ,name varchar(20));
多查询几次
通过4041代理端口查看后端master库的状态为up
MariaDB [ywx]> select * from t1; Empty set (0.00 sec)
MySQL [(none)]> select * from backends; +-------------+---------------+-------+------+------+-------------------+ | backend_ndx | address | state | type | uuid | connected_clients | +-------------+---------------+-------+------+------+-------------------+ | 1 | 10.0.0.5:3306 | up | rw | NULL | 0 | | 2 | 10.0.0.6:3306 | up | ro | NULL | 0 | +-------------+---------------+-------+------+------+-------------------+ 2 rows in set (0.00 sec)
⑦测试写是走master,读是slave
查看master和slave的数据信息
master端
MariaDB [(none)]> use ywx; MariaDB [ywx]> show tables; +---------------+ | Tables_in_ywx | +---------------+ | t1 | +---------------+ 1 row in set (0.00 sec)
slave
MariaDB [(none)]> use ywx; MariaDB [ywx]> show tables; +---------------+ | Tables_in_ywx | +---------------+ | t1 | +---------------+ 1 row in set (0.00 sec)
master和slave是一样,为了方便我们区分master和slave,我们在slave端的t1表中插入数据,master端没有数据
mster
MariaDB [ywx]> select * from t1; Empty set (0.00 sec)
slave插入数据
MariaDB [ywx]> insert into t1(id) values(1),(2); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 MariaDB [ywx]> select * from t1; +------+------+ | id | name | +------+------+ | 1 | NULL | | 2 | NULL | +------+------+ 2 rows in set (0.00 sec)
下面的所有操作都是在mysql-proxy端操作
使用4040端口登陆mysql-proxy
mysql-proxy -h 10.0.0.240 -umysql-proxy -p123456 -P4040
查询t1表,有数据,可以确定查询是走了slave库
MariaDB [(none)]> use ywx; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MariaDB [ywx]> select * from t1; +------+------+ | id | name | +------+------+ | 1 | NULL | | 2 | NULL | +------+------+ 2 rows in set (0.00 sec)
我们向t1表中写入一些数据
MariaDB [ywx]> insert into t1(id) values(3),(4),(5); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 MariaDB [ywx]> select * from t1; +------+------+ | id | name | +------+------+ | 1 | NULL | | 2 | NULL | | 3 | NULL | | 4 | NULL | | 5 | NULL | +------+------+ 5 rows in set (0.00 sec)
分表查看master库和slave库中ywx.t1表中的数据
master
MariaDB [ywx]> select * from t1; +------+------+ | id | name | +------+------+ | 3 | NULL | | 4 | NULL | | 5 | NULL | +------+------+ 3 rows in set (0.00 sec)
slave
MariaDB [ywx]> select * from t1; +------+------+ | id | name | +------+------+ | 1 | NULL | | 2 | NULL | | 3 | NULL | | 4 | NULL | | 5 | NULL | +------+------+ 5 rows in set (0.00 sec)
可以看到master和slave都有3、4、5的数据信息。
可以确定mysql-proxy插入数据是走的master的库,查询数据是走的slave库。
4.3、mysql主从的故障对mysql-proxy的影响
①mysql slave端出现故障,mysql-porxy会将查询的服务器从slave端转移到master端
主从正常,mysql-proxy查询是访问slave端
MariaDB [ywx]> select * from t1; +------+------+ | id | name | +------+------+ | 1 | NULL | | 2 | NULL | | 3 | NULL | | 4 | NULL | | 5 | NULL | +------+------+ 5 rows in set (0.00 sec)
slave故障,mysql-proxy查询有访问slave端转移到master端
MariaDB [ywx]> select * from t1; +------+------+ | id | name | +------+------+ | 3 | NULL | | 4 | NULL | | 5 | NULL | +------+------+ 3 rows in set (0.00 sec)
在mysql-proxy管理用户查看读写信息,可以发现mysql-proxy的读服务器(slave 10.0.0.6)的state会变为down,
所有业务全部转移到master(10.0.0.5)上。
也就是说slave端出现故障了,对整个业务没有影响。
[root@yum ~]# mysql -h10.0.0.240 -uadmin -padmin -P4041 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.0.99-agent-admin Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> select * from backends; +-------------+---------------+-------+------+------+-------------------+ | backend_ndx | address | state | type | uuid | connected_clients | +-------------+---------------+-------+------+------+-------------------+ | 1 | 10.0.0.5:3306 | up | rw | NULL | 0 | | 2 | 10.0.0.6:3306 | down | ro | NULL | 0 | +-------------+---------------+-------+------+------+-------------------+
恢复mysql主从。
②mysql master段出现故障,mysql-proxy只能查询不能写入
master故障宕机后
MySQL [(none)]> select * from backends; +-------------+---------------+-------+------+------+-------------------+ | backend_ndx | address | state | type | uuid | connected_clients | +-------------+---------------+-------+------+------+-------------------+ | 1 | 10.0.0.5:3306 | down | rw | NULL | 0 | | 2 | 10.0.0.6:3306 | up | ro | NULL | 0 | +-------------+---------------+-------+------+------+-------------------+ 2 rows in set (0.00 sec)
mysql-proxy可以通过slave段正常访问
MariaDB [ywx]> select * from ywx.t1; +------+------+ | id | name | +------+------+ | 1 | NULL | | 2 | NULL | | 3 | NULL | | 4 | NULL | | 5 | NULL | | 10 | NULL | +------+------+ 6 rows in set (0.00 sec)
但是无法写入数据
MariaDB [ywx]> insert into t1(id) values(11),(12); ERROR 2013 (HY000): Lost connection to MySQL server during query MariaDB [ywx]>
5、mycat的读写部署
5.1、mycat的介绍
Mycat基于阿里开源的Cobar产品而研发 , 一个彻底开源的,面向企业应用开发的大数据库集群 , 一个可 以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 ,MYCAT并不依托于任何一个商业公 司, 永不收费,永不闭源 !
mycat的原理图
5.2、mycat的部署
5.2.1实验环境:
mycat 10.0.0.240 master 10.0.0.5 slave 10.0.0.6 使用在MySQL中创建king数据库,在king数据库的t1表来做测试
在master和slave数据库中数据信息(要先创建好)
MariaDB [king]> select * from king.t1; +------+----------+ | id | name | +------+----------+ | 1 | xiaowang | | 2 | xiaogong | +------+----------+ 2 rows in set (0.00 sec)
5.2.2在master和slave部署mysql主从
#1、主从复制部署省略
5.2.3配置mycat
在mycat上配置
#2、下载安装mycat mkdir -p /server/tools cd /server/tools wget -chttp://dl.mycat.io/1.6.7.1/Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz #3、解压并移动到/usr/local下 tar -xf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz mv mycat /usr/local/ #4、安装java-jdk: yum install java-1.8.0-openjdk -y #5、# 配置mycat环境变量: echo "export PATH=/usr/local/mycat/bin:$PATH" > /etc/profile.d/mycat.sh source /etc/profile.d/mycat.sh
在master上配置
#6、在master和slave端对mycat授权,因为master和slave为主从,只需要再master上授权即可 MariaDB [(none)]> grant all on *.* to 'mycat-proxy'@'10.0.0.%' identified by '123456'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> select user,host from mysql.user; +-------------+-----------+ | user | host | +-------------+-----------+ | mycat-proxy | 10.0.0.% | | mysql-proxy | 10.0.0.% | | tongbu | 10.0.0.% | | root | 127.0.0.1 | | root | ::1 | | | localhost | | root | localhost | | | web03 | | root | web03 | +-------------+-----------+ 9 rows in set (0.00 sec) slave上自动同步 MariaDB [ywx]> select user,host from mysql.user; +-------------+-----------+ | user | host | +-------------+-----------+ | mycat-proxy | 10.0.0.% | | mysql-proxy | 10.0.0.% | | root | 127.0.0.1 | | root | ::1 | | | localhost | | root | localhost | | | web04 | | root | web04 | +-------------+-----------+ 8 rows in set (0.00 sec)
在mycat上配置
配置mycat的配置文件server.xml和schema.xml
配置server.xml,只需要配置以下的内容,其它的不用配置
#配置管理用户,可读可写 # <user name="mycat" defaultAccount="true">定义管理员用户 # <property name="password">123456</property> 定义管理员用户密码 # <property name="schemas">kaka</property>定义一个逻辑库与schemas配置文件对应 <user name="mycat" defaultAccount="true"> <property name="password">123456</property> <property name="schemas">kaka</property> </user> #配置只读用户和与管理员对应的逻辑库名 #<property name="schemas">kaka</property>定义与上面一直的逻辑库名 <user name="user"> <property name="password">user</property> <property name="schemas">kaka</property> <property name="readOnly">true</property> </user>
配置schema.xml,只需要配置以下的内容,其它的不用配置
#设置逻辑库及数据库节点 #<schema name="kaka",schema name与server.xml一致 <schema name="kaka" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema> # 配置数据库节点对应的后端真实的数据库,database真实的数据库必须存在master和slave上 <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" /> --> <dataNode name="dn1" dataHost="localhost1" database="king" /> <!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" /> <dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" /> <dataNode name="jdbc_dn2" dataHost="jdbchost" database="db2" /> <dataNode name="jdbc_dn3" dataHost="jdbchost" database="db3" /> --> # 配置读写库以及均衡 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> #配置写库(master) <writeHost host="hostM1" url="10.0.0.5:3306" user="mycat-proxy" password="123456"> <!-- can have multi read hosts --> #配置读库(slave) <readHost host="hostS1" url="10.0.0.6:3306" user="mycat-proxy" password="123456" /> #配置写库,master库宕机了,数据写入将由配置的hostM1服务器转移到下面的hostM2的服务器来写入 </writeHost> <writeHost host="hostM2" url="10.0.0.6:3306" user="mycat-proxy" password="123456" />
启动mycat
[root@yum conf]# mycat start Starting Mycat-server...
[root@yum conf]# netstat -anlp|grep 066 tcp6 0 0 :::8066 :::* LISTEN 84580/java tcp6 0 0 :::9066 :::* LISTEN 84580/java #8066为mycat的数据端口 #9066为mycat的管理端口
5.2.4连接测试:
先把mycat的日志模式改为debug模式
vim /usr/local/mycat/conf/log4j2.xml
把level="info"改为level="debug",后重启mycat (mycat restart)
<asyncRoot level="debug" includeLocation="true"> <!--<AppenderRef ref="Console" />--> <AppenderRef ref="RollingFile"/>
连接数据库:
mysql -umycat -p123456 -P8066 -h10.0.0.240
Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.29-mycat-1.6.7.1-release-20190627191042 MyCat Server (OpenCloudDB) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]>
在mycat下查看数据库信息
MySQL [(none)]> show databases; +----------+ | DATABASE | +----------+ | kaka | +----------+ 1 row in set (0.00 sec) MySQL [(none)]> use kaka; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MySQL [kaka]> show tables; +----------------+ | Tables_in_king | +----------------+ | t1 | +----------------+ 1 row in set (0.01 sec) MySQL [kaka]> desc t1; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.01 sec) MySQL [kaka]> select * from t1; +------+----------+ | id | name | +------+----------+ | 1 | xiaowang | | 2 | xiaogong | +------+----------+ 2 rows in set (0.01 sec)
可以看出在mycat中kaka库(在server.xml中创建的逻辑库)对应的后端mysql中的king库(mysql中真实存在的库),其数据信息时完全一致的。
在mycat上开启mycat日志信息
[root@yum ~]# echo > /usr/local/mycat/logs/mycat.log [root@yum ~]# tailf /usr/local/mycat/logs/mycat.log
先在mycat上查询数据信息
MySQL [kaka]> select * from t1; +------+----------+ | id | name | +------+----------+ | 1 | xiaowang | | 2 | xiaogong | +------+----------+ 2 rows in set (0.00 sec)
在mycat日志上可以看到一条如下的信息,通过该日志信息可以看出mycat的查询是在slave数据据(10.0.0.6)上查询的
[node=dn1{select * from t1}, packetId=6], host=10.0.0.6, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
在mycat上给t1表创建一条数据信息
MySQL [kaka]> insert into t1 values(3,"xiaoxiao"),(4,"popo"); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 MySQL [kaka]> select * from t1; +------+----------+ | id | name | +------+----------+ | 1 | xiaowang | | 2 | xiaogong | | 3 | xiaoxiao | | 4 | popo | +------+----------+ 6 rows in set (0.00 sec)
在mycat日志上可以看到一条如下的信息,通过该日志信息可以看出mycat更改数据库信息是在master数据据(10.0.0.5)上执行相应的sql语句
[node=dn1{insert into t1 values(3,"xiaoxiao"),(4,"popo")}, packetId=0], host=10.0.0.5, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=true]
5.3、mysql主从数据故障了对mycat的影响
mysql主从数据库其中一台宕机了对mycat没有任何影响。 slave宕机了,mycat自动把数据的读取转移到master上; master宕机了,mycat自动把数据的读取转移到slave上。
模拟master宕机:
在master上关闭数据库
[root@web03 ~]# systemctl stop mariadb
在mycat上写入数据信息
MySQL [kaka]> insert into t1 values(5,"aaa"); Query OK, 1 row affected (0.01 sec)
可以看到数据信息是通过slave(10.0.0.6)写入数据库的
[node=dn1{insert into t1 values(5,"aaa")}, packetId=1], host=10.0.0.6, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=true]
5.4mycat一般错误解决
MySQL [lutixiadb]> show tables; ERROR 1184 (HY000): Invalid DataSource:0 可能是后端节点出现了问题,也有可能是代理端无法连上后端节点导致: 可以先在代理端直接用授权用户名和密码登录后端数据库测试连接问题: [root@node3 conf]# mysql -umycat-proxy -h192.168.75.134 -p123456 ERROR 1129 (HY000): Host 'node3' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' # 可以看到因为多次错误,代理端服务器被锁定了,所以也会出现上面的报错: 在后端主库执行如下命令: mysqladmin flush-hosts 再次测试,一般问题就能解决。