Mysql AB复制

​ AB复制又称之为主从复制,用于实现数据同步,实现Mysql的AB复制时,数据库的版本尽量保持一致,如果不能保持一致,最起码从服务器的版本要高于主服务器,但是就无法实现双向复制技术.

Mysql AB复制的好处

1.解决宕机带来的数据不一致问题,因为Mysql复制可以实时备份数据.

2.多台服务器的性能一般比单台好,且可以减轻数据库服务器的压力,因为备份等操作可以在从服务器上进行,但是AB复制不适用于大数据量,如果是一个主服务器有多台从服务器,那么主服务器需要同时向多台服务器中写入数据,压力会很大,这个时候就推荐使用集群.

​ Mysql复制(replication)是一个异步的复制,从一个Mysql实例(Master)复制到另一个Mysql实例(Slave),整个主从复制需要由Master服务器上的IO进程,Slave服务器上的Sql线程和IO线程共同完成,首先Master端必须打开binary log(bin-log),因为整个Mysql复制过程实际上就是Slave从Master端获取相应的二进制日志,然后在本地完全顺序的执行日志中所记录的各种操作.

传统主从复制基本过程:

  1. # 1. Mysql slave端的ID进程连接上Master,向Master请求指定日志文件的指定位置(或者最开始日志)之后的日志内容;
  2. # 2. Master接收到来自Slave的IO进程的请求后,负责复制的IO进程根据Slave的请求信息,读取相应日志内容,返回Slave的IO进程,并将相应日志内容返回给Slave的IO进程,并将本次请求读取的bin-log文件名及位置一起返回Slave端.
  3. # 3. Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”;
  4. # 4. Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
复制原理

从库生成两个线程,一个I/O,一个SQL线程,I/O线程去请求主库的binlog,并将得到的binlog日志写到relay log(中继日志)文件中;

主库会生成一个Log dump线程,用来给从库I/O线程传binlog;

从库的SQL线程会读取relay log文件的日志,并解析成具体操作,从而实现主从数据一致

  1. # 两个进程一个线程
  2. # IO进程: 负责下载日志,中继日志
  3. # SQL进程: SQL负责将中继日志应用到数据库中,完成AB复制数据同步.
  4. # logdump线程:

主从复制方式

  1. # 1. 同步复制
  2. # master服务器操作完成,当操作作为时间写入二进制日志,传递给slave,存放到中继日志中,然后再本地执行完成功,即反馈成功.
  3. # 2. 半同步复制
  4. # 当有多台slave服务器时,master向离自己最近的slave服务器同步二进制文件后,即为反馈成功,不是Mysql官方提供的,是5.5版本时google研发半同步不定后支持,需要semi插件.
  5. # 3. 异步复制:
  6. # Master服务器操作完成,当操作作为事件写入二进制日志,即反馈成功(默认)
  7. # 4. 基于GTID复制技术(5.6版本才有)
  8. # 见下面
  9. # 5. 多源复制(5.7)
  10. # 1. 方便备份数据
  11. # 2. 方便对数据进行统一分析

GTID复制

GTID作用

1. 使用GITD技术可以让两台服务器自动交换事务ID,经过对比,请求数据,保证服务器之间的数据是同步的;

2. 提升安全性,多事务并行执行时,也不会造成数据混乱;

3. 多线程复制,从服务器可以启动多个SQL Threfad,并发执行多个库的复制,提升速度

GTID复制案例

注意事项

网络问题

  1. # 要注意mysql主库和从库所在服务器间的网络问题,因为是要做数据库的主从,主从之间的网络是要能通的,及从库可通过网络访问到主库,否则无法同步数据.
  2. # 如果mysql主从使用的是云服务器,注意去该云服务器的管理平台,开放相应数据库的安全组(如阿里云,青云,腾讯云)

mysql的版本问题

  1. # 主从的数据是要进行同步的,如果数据库版本或者安装方式不同,会影响数据的同步,产生无法同步或字符集报错的情况
  2. # 主库和从库的服务器,安装mysql数据库时,要选择相应的版本,并且安装方式最好相同

配置文件问题

  1. # mysql或mariadb的关键配置文件是my.cnf,默认位置为etc/my.cnf(由于安装方式的不同,此配置文件,并不一定在此)
  2. # 做主从时,注意要在启动数据库前,修改配置文件my.cnf后,再启动数据库服务
  3. # 注意主从配置时,必须要在my.cnf中添加server-id,主的server-id的数值要小于从的server-id,每一个server-id都必须是唯一的
  4. # 注意主从配置时,必须要在my.cnf中添加log-bin,开启二进制文件
  5. # 数据库如配置有调优参数,应使主从的配置文件中参数数值相同,避免因参数不同导致的失败

授权问题

  1. # 数据库的同步是要通过主库专门创建的一个用户来使从库进行数据的同步的,因此要注意授权的问题
  2. # 注意主库授权时的ip,用户,密码grant replication slave on . to ‘用户’@‘从库的IP’ identified by ‘密码’
  3. # 注意从库连接主库的各项参数
  4. # change master to master_host = ‘主库的IP’, master_user = ‘设置主从时设定的主库的用户’, master_port=主库的端口, master_password=’主库设定的密码’, master_log_file = ‘主库状态的File’, master_log_pos=主库状态的Position;

数据库差别问题

  1. # 我们在做新的mysql主从的时候,由于主库并没有产生较多的数据,从库很容易就进行同步,报错也几乎不会产生
  2. # 但是,当我们的主库的数据已经有很多了或者是把一个用了很久的数据库来做主从,这时就需要先将主库的数据备份导入从库中,再进行从库的连接到主库的步骤。否则,就会从库就会因数据差别较大,产生各种报错
安装Mysql

先在两台机器执行下面脚本,分别安装好数据库,并改好密码

  1. #!/usr/bin/env bash
  2. # Author: ZhouJian
  3. # Mail: 18621048481@163.com
  4. # Time: 2019-9-3
  5. # Describe: CentOS 7 Install Mysql.rpm Script
  6. clear
  7. echo -ne "\\033[0;33m"
  8. cat<<EOT
  9. _oo0oo_
  10. 088888880
  11. 88" . "88
  12. (| -_- |)
  13. 0\\ = /0
  14. ___/'---'\\___
  15. .' \\\\\\\\| |// '.
  16. / \\\\\\\\||| : |||// \\\\
  17. /_ ||||| -:- |||||- \\\\
  18. | | \\\\\\\\\\\\ - /// | |
  19. | \\_| ''\\---/'' |_/ |
  20. \\ .-\\__ '-' __/-. /
  21. ___'. .' /--.--\\ '. .'___
  22. ."" '< '.___\\_<|>_/___.' >' "".
  23. | | : '- \\'.;'\\ _ /';.'/ - ' : | |
  24. \\ \\ '_. \\_ __\\ /__ _/ .-' / /
  25. ====='-.____'.___ \\_____/___.-'____.-'=====
  26. '=---='
  27. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  28. 建议系统 CentOS7
  29. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  30. # PS:请尽量使用纯净的CentOS7系统,我们会在服务器安装Mysql5.7,
  31. # 将mysql-5.7.23-1.el7.x86_64.rpm-bundle.tar包和脚本放到root目录下执行即可,密码为ZHOUjian.20
  32. EOT
  33. echo -ne "\\033[m"
  34. init_security() {
  35. systemctl stop firewalld
  36. systemctl disable firewalld &>/dev/null
  37. setenforce 0
  38. sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
  39. sed -i '/^GSSAPIAu/ s/yes/no/' /etc/ssh/sshd_config
  40. sed -i '/^#UseDNS/ {s/^#//;s/yes/no/}' /etc/ssh/sshd_config
  41. systemctl enable sshd crond &> /dev/null
  42. echo -e "\033[32m [安全配置] ==> OK \033[0m"
  43. }
  44. init_yumsource() {
  45. if [ ! -d /etc/yum.repos.d/backup ];then
  46. mkdir /etc/yum.repos.d/backup
  47. fi
  48. mv /etc/yum.repos.d/* /etc/yum.repos.d/backup 2>/dev/null
  49. if ! ping -c2 www.baidu.com &>/dev/null
  50. then
  51. echo "您无法上外网,不能配置yum源"
  52. exit
  53. fi
  54. curl -o /etc/yum.repos.d/163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
  55. curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  56. timedatectl set-timezone Asia/Shanghai
  57. echo "nameserver 114.114.114.114" > /etc/resolv.conf
  58. echo "nameserver 8.8.8.8" >> /etc/resolv.conf
  59. chattr +i /etc/resolv.conf
  60. echo -e "\033[32m [YUM Source] ==> OK \033[0m"
  61. }
  62. init_mysql() {
  63. rpm -e mariadb-libs --nodeps
  64. rm -rf /var/lib/mysql
  65. rm -rf /etc/my.cnf
  66. tar xvf /root/mysql-5.7.23-1.el7.x86_64.rpm-bundle.tar -C /usr/local/
  67. cd /usr/local
  68. rpm -ivh mysql-community-server-5.7.23-1.el7.x86_64.rpm \
  69. mysql-community-client-5.7.23-1.el7.x86_64.rpm \
  70. mysql-community-common-5.7.23-1.el7.x86_64.rpm \
  71. mysql-community-libs-5.7.23-1.el7.x86_64.rpm
  72. rm -rf mysql-community-*
  73. }
  74. changepass() {
  75. sed -i '/\[mysqld]/ a skip-grant-tables' /etc/my.cnf
  76. systemctl restart mysqld
  77. mysql <<EOF
  78. update mysql.user set authentication_string='' where user='root' and Host='localhost';
  79. flush privileges;
  80. EOF
  81. sed -i '/skip-grant/d' /etc/my.cnf
  82. systemctl restart mysqld
  83. yum -y install expect ntpdate
  84. expect <<-EOF
  85. spawn mysqladmin -uroot -p password "ZHOUjian.20"
  86. expect {
  87. "password" { send "\r" }
  88. }
  89. expect eof
  90. EOF
  91. systemctl restart mysqld
  92. }
  93. main() {
  94. init_hostname
  95. init_security
  96. init_yumsource
  97. init_mysql
  98. changepass
  99. }
  100. main
修改配置文件

mysql主库配置

  1. [root@mysqlhost ~]# cat /etc/my.cnf
  2. [mysqld]
  3. datadir=/var/lib/mysql
  4. socket=/var/lib/mysql/mysql.sock
  5. symbolic-links=0
  6. log-error=/var/log/mysqld.log
  7. pid-file=/var/run/mysqld/mysqld.pid
  8. server-id = 1
  9. log-bin=mysql-bin

mysql从库配置

  1. [root@mysql-from ~]# cat /etc/my.cnf
  2. [mysqld]
  3. datadir=/var/lib/mysql
  4. socket=/var/lib/mysql/mysql.sock
  5. symbolic-links=0
  6. log-error=/var/log/mysqld.log
  7. pid-file=/var/run/mysqld/mysqld.pid
  8. server-id = 2
  9. log-bin = mysql-bin

主从两台服务器分别重启服务

systemctl restart mysqld

主数据库授权从库
  1. # 创建用于同步的用户账号及密码
  2. grant replication slave on *.* to 'slave'@'192.168.0.%' identified by 'ZHOUjian.200';
  3. # 重新加载权限表,更新权限
  4. flush privileges;
  5. # 查看master的状态
  6. #mysql> show master status;
  7. #+------------------+----------+--------------+------------------+-------------------+
  8. #| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  9. #+------------------+----------+--------------+------------------+-------------------+
  10. #| mysql-bin.000001 | 600 | | | |
  11. #+------------------+----------+--------------+------------------+-------------------+
  12. #1 row in set (0.00 sec)
从库开启Slave
  1. change master to
  2. master_host='192.168.0.102',
  3. master_user='slave',
  4. master_password='ZHOUjian.200',
  5. master_auto_position=0;
  6. mysql> start slave;
  7. # 查看从库状态
  8. mysql> show slave status\G;
  9. *************************** 1. row ***************************
  10. Slave_IO_State: Waiting for master to send event
  11. Master_Host: 192.168.0.117
  12. Master_User: slave
  13. Master_Port: 3306
  14. Connect_Retry: 60
  15. Master_Log_File: mysql-bin.000001
  16. Read_Master_Log_Pos: 600
  17. Relay_Log_File: mysql-from-relay-bin.000002
  18. Relay_Log_Pos: 813
  19. Relay_Master_Log_File: mysql-bin.000001
  20. Slave_IO_Running: Yes # 此处两个yes有一个不是就会失败
  21. Slave_SQL_Running: Yes #
  22. Replicate_Do_DB:
  23. Replicate_Ignore_DB:
  24. Replicate_Do_Table:
  25. Replicate_Ignore_Table:
  26. Replicate_Wild_Do_Table:
  27. Replicate_Wild_Ignore_Table:
  28. Last_Errno: 0
  29. Last_Error:
  30. Skip_Counter: 0
  31. Exec_Master_Log_Pos: 600
  32. Relay_Log_Space: 1025
  33. Until_Condition: None
  34. Until_Log_File:
  35. Until_Log_Pos: 0
  36. Master_SSL_Allowed: No
  37. Master_SSL_CA_File:
  38. Master_SSL_CA_Path:
  39. Master_SSL_Cert:
  40. Master_SSL_Cipher:
  41. Master_SSL_Key:
  42. Seconds_Behind_Master: 0
  43. Master_SSL_Verify_Server_Cert: No
  44. Last_IO_Errno: 0
  45. Last_IO_Error:
  46. Last_SQL_Errno: 0
  47. Last_SQL_Error:
  48. Replicate_Ignore_Server_Ids:
  49. Master_Server_Id: 1
  50. Master_UUID: ff0c0da9-8f72-11ea-9d83-000c29245a7e
  51. Master_Info_File: /var/lib/mysql/master.info
  52. SQL_Delay: 0
  53. SQL_Remaining_Delay: NULL
  54. Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
  55. Master_Retry_Count: 86400
  56. Master_Bind:
  57. Last_IO_Error_Timestamp:
  58. Last_SQL_Error_Timestamp:
  59. Master_SSL_Crl:
  60. Master_SSL_Crlpath:
  61. Retrieved_Gtid_Set:
  62. Executed_Gtid_Set:
  63. Auto_Position: 0
  64. Replicate_Rewrite_DB:
  65. Channel_Name:
  66. Master_TLS_Version:
  67. 1 row in set (0.00 sec)

主从复制基础添加多个从库

以下操作是基于上面的GTID复制案例喔,请做完GTID再做这里,大佬请无视这句话

更改新增从库my.cnf的配置
  1. [root@mysql-from2 ~]# cat /etc/my.cnf
  2. [mysqld]
  3. datadir=/var/lib/mysql
  4. socket=/var/lib/mysql/mysql.sock
  5. symbolic-links=0
  6. log-error=/var/log/mysqld.log
  7. pid-file=/var/run/mysqld/mysqld.pid
  8. server-id = 3
  9. log-bin = mysql-bin

修改配置记得重启mysqld服务生效配置

systemctl restart mysqld

主库给新加的从库创建用于同步的账号和密码
  1. # 创建用于同步的用户账号及密码
  2. grant replication slave on *.* to 'slave'@'192.168.0.%' identified by 'ZHOUjian.200';
  3. # 重新加载权限表,更新权限
  4. flush privileges;
进入主库
  1. # 先进入主库,进行锁表,此处锁定为只读状态,防止数据写入 (可选,因如有数据库备份,可直接利用备份)
  2. flush tables with read lock;
  3. mysqldump -uroot -p‘….’ -hlocalhost > mysql.back.sql
  4. scp mysql.back.sql 从库IP:/root/(任意位置)
  5. # 从库导入数据
  6. mysql -uroot -p... -f < mysql.back.sql
  7. # 主库解锁
  8. unlock tables;
进入从库连接主库
  1. # 从库开启slave
  2. change master to
  3. master_host='192.168.0.102',
  4. master_user='slave',
  5. master_password='ZHOUjian.200',
  6. master_auto_position=0;
  7. mysql> start slave;
  8. # 查看从库状态
  9. mysql> show slave status\G;
  10. *************************** 1. row ***************************
  11. Slave_IO_State: Waiting for master to send event
  12. Master_Host: 192.168.0.102
  13. Master_User: slave
  14. Master_Port: 3306
  15. Connect_Retry: 60
  16. Master_Log_File: mysql-bin.000001
  17. Read_Master_Log_Pos: 600
  18. Relay_Log_File: mysql-from-relay-bin.000002
  19. Relay_Log_Pos: 813
  20. Relay_Master_Log_File: mysql-bin.000001
  21. Slave_IO_Running: Yes # 此处两个yes有一个不是就会失败
  22. Slave_SQL_Running: Yes #
  23. Replicate_Do_DB:
  24. Replicate_Ignore_DB:
  25. Replicate_Do_Table:
  26. Replicate_Ignore_Table:
  27. Replicate_Wild_Do_Table:
  28. Replicate_Wild_Ignore_Table:
  29. Last_Errno: 0
  30. Last_Error:
  31. Skip_Counter: 0
  32. Exec_Master_Log_Pos: 600
  33. Relay_Log_Space: 1025
  34. Until_Condition: None
  35. Until_Log_File:
  36. Until_Log_Pos: 0
  37. Master_SSL_Allowed: No
  38. Master_SSL_CA_File:
  39. Master_SSL_CA_Path:
  40. Master_SSL_Cert:
  41. Master_SSL_Cipher:
  42. Master_SSL_Key:
  43. Seconds_Behind_Master: 0
  44. Master_SSL_Verify_Server_Cert: No
  45. Last_IO_Errno: 0
  46. Last_IO_Error:
  47. Last_SQL_Errno: 0
  48. Last_SQL_Error:
  49. Replicate_Ignore_Server_Ids:
  50. Master_Server_Id: 1
  51. Master_UUID: ff0c0da9-8f72-11ea-9d83-000c29245a7e
  52. Master_Info_File: /var/lib/mysql/master.info
  53. SQL_Delay: 0
  54. SQL_Remaining_Delay: NULL
  55. Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
  56. Master_Retry_Count: 86400
  57. Master_Bind:
  58. Last_IO_Error_Timestamp:
  59. Last_SQL_Error_Timestamp:
  60. Master_SSL_Crl:
  61. Master_SSL_Crlpath:
  62. Retrieved_Gtid_Set:
  63. Executed_Gtid_Set:
  64. Auto_Position: 0
  65. Replicate_Rewrite_DB:
  66. Channel_Name:
  67. Master_TLS_Version:
  68. 1 row in set (0.00 sec)

数据库中间 MyCAT 读写分离实现

Mysql读写分离实现方式

解决并发问题,不同于分表,分表用于解决数据量过大的问题

方式一: 业务层使用不同的数据库

方式二: 使用负载均衡,判断是什么语句,分配到不同的数据库

基于应用层和数据层中间件的代理层,主要解决方案如下:

  1. # 1. 开发人员
  2. # 2. 软件
  3. # mysql-proxy Mysql官方
  4. # amoeba JAVA 阿里
  5. # Atlas 奇虎360
  6. # Sharding-JDBC
  7. # DBProxy 美团点评
  8. # Amoeba 早期阿里巴巴
  9. # cobar (MyCAT前身,java)
  10. # MyCat 阿里巴巴
  11. # 这些中间件,统一为多个数据库进行代理,应用只需要连接中间件(分布式数据库系统),执行SQL,中间件就会根据规则,将SQL分配到不同的数据库中
MyCat简介

Mycat 是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有存 储引擎,所以并不是完全意义的分布式数据库系统。 那么 Mycat 是什么?Mycat 是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服 务。

MyCAT 是使用 JAVA 语言进行编写开发,使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性,所以要求必须在 JDK7 以上的版本上运行。

认识MyCat 中的概念

逻辑架构图

DBA 或者运维人员对数据进行分片处理之后,从原有的一个库,被切分为多个分片数据库,所有的分片数据库集 群构成了整个完整的数据库存储。

如上图所表示,数据被分到多个分片数据库后,应用如果需要读取数据,就要需要处理多个数据源的数据。 如果没有数据库中间件,那么应用将直接面对分片集群,数据源切换、事务处理、数据聚合都需要应用直接处 理,原本该是专注于业务的应用,将会花大量的工作来处理分片后的问题,最重要的是每个应用处理将是完全的 重复造轮子。 所以有了数据库中间件,应用只需要集中与业务处理,大量的通用的数据聚合,事务,数据源切换都由中间 件来处理,中间件的性能与处理能力将直接决定应用的读写性能,所以一款好的数据库中间件至关重要。

逻辑库(schema)

通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道 数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。

在云计算时代,数据库中间件可以以多租户的形式给一个或多个应用提供服务,每个应用访问的可能是一个 独立或者是共享的物理库,常见的如阿里云数据库服务器 RDS。

逻辑表(table)

既然有逻辑库,那么就会有逻辑表,分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表,可 以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成。

分片规则(rule)

数据切分,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到 某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难度。

部署MyCat

系统环境清单

list

  1. [MysqlRead-Write-Server]
  2. System = CentOS7.6.1810
  3. jdk-8u151-linux-x64.tar.gz
  4. mysql-5.7.23-1.el7.x86_64.rpm-bundle.tar
  5. Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
节点名 IP 软件版本 硬件 网络 说明
mysql_host 192.168.171.143 list 里面 2C4G Nat,内网 测试环境
mysql_from 192.168.171.144 list里面 2C4G Nat,内网 测试环境
mycat 192.168.171.128 list里面 2C4G Nat,内网 测试环境
test_clent 192.168.171.132 list里面 2C4G Nat,内网 测试环境
安装Java环境
  1. tar xvf jdk-8u151-linux-x64.tar.gz -C /usr/local/
  2. ln -s /usr/local/jdk1.8.0_151/ /usr/local/java
  3. # 配置环境变量
  4. vi /etc/profile.d/java.sh
  5. export JAVA_HOME=/usr/local/java
  6. export PATH=$JAVA_HOME/bin:$PATH
  7. export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  8. source /etc/profile.d/java.sh
下载安装MyCat
  1. wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE=20161028204710-linux.tar.gz
  2. # 解压
  3. tar -xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
  4. ls /usr/local/mycat/
  5. bin catlet conf lib logs version.txt

MyCAT 目前主要通过配置文件的方式来定义逻辑库和相关配置

  1. /usr/local/mycat/conf/server.xml`
  2. # 定义用户以及系统相关变量,如端口等。其中用户信息是前端应用程序连接 mycat 的用户信息。
  3. /usr/local/mycat/conf/schema.xml`
  4. # 定义逻辑库,表、分片节点等内容。
  5. /usr/local/mycat/conf/rule.xml`
  6. # 中定义分片规则
配置 server.xml

下面的用户和密码是应用程序连接到 MyCat 使用的,可以自定义配置

而其中的schemas 配置项所对应的值是逻辑数据库的名字,也可以自定义,但是这个名字需要和后面 schema.xml 文件中配置的一致。

  1. shell> vim server.xml
  2. <user name="mycatdb">
  3. <property name="password">ZHOUjian.21</property>
  4. <property name="schemas">schema_shark_db</property>
  5. <!-- 表级 DML 权限设置 -->
  6. <!--
  7. <privileges check="false">
  8. <schema name="TESTDB" dml="0110" >
  9. <table name="tb01" dml="0000"></table>
  10. <table name="tb02" dml="1111"></table>
  11. </schema>
  12. </privileges>
  13. -->
  14. </user>
  15. <!--下面是另一个用户,并且设置的访问 TESTED 逻辑数据库的权限是 只读
  16. <user name="user">
  17. <property name="password">user</property>
  18. <property name="schemas">TESTDB</property>
  19. <property name="readOnly">true</property>
  20. </user>
  21. -->

上面的配置中,假如配置了用户访问的逻辑库,那么必须在 schema.xml 文件中也配置这个逻辑库,否则报错,启动 mycat 失败

配置 schema.xml

以下是配置文件中的每个部分的配置块儿

逻辑库和分表设置

  1. <schema name="schema_shark_db" // 逻辑库名称
  2. checkSQLschema="false" // 不检查
  3. sqlMaxLimit="100" // 最大连接数
  4. dataNode='dn1'> // 数据节点名称
  5. <!--这里定义的是分表的信息-->
  6. </schema>

数据节点

  1. <dataNode name="dn1" // 此数据节点的名称
  2. dataHost="localhost1" // 主机组
  3. database="shark_db"> // 真实的数据库名称
  4. </dataNode>

主机组

  1. <dataHost name="localhost1"
  2. maxCon="1000" minCon="10" // 连接
  3. balance="0" // 负载均衡
  4. writeType="0" // 写模式配置
  5. dbType="mysql" dbDriver="native" // 数据库配置
  6. switchType="1" slaveThreshold="100">
  7. <!--这里可以配置关于这个主机组的成员信息,和针对这些主机的健康检查语句-->
  8. </dataHost>
  1. # balance属性
  2. # 负载均衡类型,目前的取值有三种
  3. # 1. balance="0",不开启读写分离机制,所有读操作都发送到当前的writeHost上.
  4. # 2. balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S2,M2->S2,并且M1与M2互为主备),正常情况下,M2,S1,S2参与select语句的负载均衡.
  5. # 3. balance="2",所有的读操作都随机的再writeHost,readhost上分发.
  6. # 4. balance="3",所有读请求随机的分发到writeHost对应的readhost执行,writeHost不分担读压力,注意balance=3只在1.4以及以后版本有,1.3没有
  7. # writeType属性
  8. # 负载均衡类型,目前的取值有三种:
  9. # 1. writeType="0",所有写操作发送到配置的第一个writeHost,第一个挂了切换到还生存的第二个writeHost,重新启动后已切换后的为准
  10. # 2. writeType="1",所有写操作都随机的发送到配置的writeHost,1.5以后飞起不推荐

健康检查

  1. <heartbeat>select user()</heartbeat>

读写配置

  1. <writeHost host="hostM1" url="172.16.153.10:3306"
  2. user="root" password="123">
  3. <!-- can have multi read hosts -->
  4. <readHost host="hostS2" url="172.16.153.11:3306"
  5. user="root" password="123" /></writeHost>

以下是组合为完整的配置文件,适用于一主一从的架构

  1. <?xml version="1.0"?>
  2. <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
  3. <mycat:schema xmlns:mycat="http://io.mycat/">
  4. <schema name="youmen" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
  5. <!--这里定义的是分库分表的信息-->
  6. </schema>
  7. <!--下面是配置读写分离的信息-->
  8. <dataNode name="dn1" dataHost="localhost1" database="yueyue" />
  9. <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
  10. writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
  11. <heartbeat>select user()</heartbeat>
  12. <writeHost host="hostM1" url="192.168.171.144:3306" user="mycatuser" password="ZHOUjian.21">
  13. <readHost host="hostS2" url="192.168.171.143:3306" user="mycatuser" password="ZHOUjian.21" />
  14. </writeHost>
  15. </dataHost>
  16. </mycat:schema>
配置 log4j2.xml
  1. <!--设置日志级别为 debug , 默认是 info-->
  2. <asyncRoot level="debug" includeLocation="true">
在真实的 master 数据库上给用户授权
  1. grant all on *.* to "mycatuser"@"%" identified by "ZHOUjian.21";
  2. flush privileges;
启动 mycat
  1. /usr/local/mycat/bin/mycat start
  2. # 支持一下参数
  3. start | restart |stop | status
  4. # 看一下端口
  5. ss -antp |grep -E "8066|9066"
  6. LISTEN 0 100 :::9066 :::* users:(("java",pid=14923,fd=72))
  7. LISTEN 0 100 :::8066 :::* users:(("java",pid=14923,fd=76))

测试

在 mycat 的机器上测试用户权限有效性

  1. # Mycat这台机器不需要装Mysql,只要有mysql命令即可
  2. # 测试是否能正常登录上 主服务器
  3. mysql -umycatuser -pZHOUjian.21 -h 192.168.171.143
  4. # 继续测试是否能登录上从服务器
  5. mysql -umycatuser -pZHOUjian.21 -h 192.168.171.144

接下来我们使用客户端,看是否能不能连接到Mycat做代理

  1. # 此处的账号密码是你server.xml文件定义的
  2. mysql -uzhou -pZHOUjian.21 -h 192.168.171.128 -P 8066
  3. mysql> show databases;
  4. +----------+
  5. | DATABASE |
  6. +----------+
  7. | youmen |
  8. +----------+
  9. mysql> use youmen
  10. Database changed
  11. mysql> create table zhou(id int,name varchar(20),age int);
  12. # 接下来我们去主库从库验证,看代理有没有把我们创建的表同步
  13. mysql -uroot -pZHOUjian.20 -e 'use yueyue; show tables;'
  14. +------------------+
  15. | Tables_in_yueyue |
  16. +------------------+
  17. | zhou | |
  18. +------------------+

继续测试读写分离策略

使用 mysql 客户端工具使用 mycat 的账户和密码登录 mycat ,

之后执行 select 语句。

之后查询 mycat 主机上 mycat 安装目录下的 logs/mycat.log 日志。

在日志重搜索查询的语句或者查询 从库的 ip 地址,应该能搜索到

04 . Mysql主从复制和读写分离的更多相关文章

  1. Linux下MySQL主从复制(GTID)+读写分离(ProxySQL)-实施笔记

    GTID概念: GTID( Global Transaction Identifier)全局事务标识.GTID 是 5.6 版本引入的一个有关于主从复制的重大改进,相对于之前版本基于 Binlog 文 ...

  2. Mysql主从复制,读写分离(mysql-proxy),双主结构完整构建过程

    下面介绍MySQL主从复制,读写分离,双主结构完整构建过程,不涉及过多理论,只有实验和配置的过程. Mysql主从复制(转载请注明出处,博文地址:) 原理是master将改变记录到二进制日志(bina ...

  3. Mysql主从复制,读写分离

    一个简单完整的 Mysql 主从复制,读写分离的示意图. 1. 首先搭建 Mysql 主从架构,实现 将 mater 数据自动复制到 slave MySQL 复制的工作方式很简单,一台服务器作为主机, ...

  4. Mysql 主从复制,读写分离设置

    一个简单完整的 Mysql 主从复制,读写分离的示意图. 1. 首先搭建 Mysql 主从架构,实现 将 mater 数据自动复制到 slave MySQL 复制的工作方式很简单,一台服务器作为主机, ...

  5. mysql主从复制以及读写分离

    之前我们已经对LNMP平台的Nginx做过了负载均衡以及高可用的部署,今天我们就通过一些技术来提升数据的高可用以及数据库性能的提升. 一.mysql主从复制 首先我们先来看一下主从复制能够解决什么问题 ...

  6. Mysql主从复制,读写分离(mysql-proxy)

    Mysql主从复制,读写分离(mysql-proxy) 下面介绍MySQL主从复制,读写分离,双主结构完整构建过程,不涉及过多理论,只有实验和配置的过程. Mysql主从复制(转载请注明出处,博文地址 ...

  7. MySQL 主从复制与读写分离 (超详细图文并茂小白闭着眼睛都会做)

    MySQL 主从复制与读写分离 1.什么是读写分离 2.为什么要读写分离 3.什么时候要读写分离 4.主从复制与读写分离 5.mysql支持的复制类型 6.主从复制的工作过程 7.MySQL主从复制延 ...

  8. 30.Mysql主从复制、读写分离

    Mysql主从复制.读写分离 目录 Mysql主从复制.读写分离 读写分离 读写分离概述 为什么要读写分离 什么时候要读写分离 主从复制与读写分离 mysql支持的复制类型 主从复制的工作过程 初始环 ...

  9. Windows操作系统下的MySQL主从复制及读写分离[转]

    mysql主从复制配置   保证主库和从库数据库数据一致 mysql主库MASTER配置(在my.cnf中加入以下配置):log-bin=master-binbinlog-do-db=test #需要 ...

随机推荐

  1. Jenkins联动码云自动匹配分支进行构建流水线

    一.安装Generic Webhook Trigger插件 二.创建项目 创建项目之前先准备自己的项目,如果没有可以我fork的一个项目.地址是:https://gitee.com/jokerbai/ ...

  2. Java——集合系列(1)框架概述

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 集合框架概述 Jav ...

  3. 如何在C#/.NET Core中使用责任链模式

    原文:Chain Of Responsbility Pattern In C#/.NET Core 作者:Wade 译者:Lamond Lu 最近我有一个朋友在研究经典的"Gang Of F ...

  4. Edge Weight Assignment(树-异或-贪心)

    大意: 给定一棵无根树,要求你任意设置n-1条边的边权. 使得任意叶子节点间边权的XOR值为0: 此时,令f为所有边权数值不同的个数,求最小的f和最大的f. \(\color{Red}{------- ...

  5. C - 小明系列故事――捉迷藏 HDU - 4528 bfs +状压 旅游-- 最短路+状压

    C - 小明系列故事――捉迷藏 HDU - 4528 这个题目看了一下题解,感觉没有很难,应该是可以自己敲出来的,感觉自己好蠢... 这个是一个bfs 用bfs就很好写了,首先可以预处理出大明和二明能 ...

  6. Coursera课程笔记----计算导论与C语言基础----Week 10

    C程序中的数组(Week 10) 一维数组 数组的定义 类型 数组名[常量表达式] int sheep[10] 定义数组时,[]内必须为常量表达式 可以用const int 可以在main函数前,#d ...

  7. iOS中的几种锁的总结,三种开启多线程的方式(GCD、NSOperation、NSThread)

    学习内容 欢迎关注我的iOS学习总结--每天学一点iOS:https://github.com/practiceqian/one-day-one-iOS-summary OC中的几种锁 为什么要引入锁 ...

  8. 设计模式之GOF23解释器模式

    解释器模式Interpreter -是一种不常用的设计模式 -用于描述如何构成一个简单的语言解释器,主要用于使用面向对象语言开发的编译器和解释器设计 -当我们需要开发一种新的语言时,可以考虑使用解释器 ...

  9. 内容安全策略(CSP)详解

    1.背景 1.1.同源策略 网站的安全模式源于"同源策略",web浏览器允许第一个web页面中的脚本访问页面中的数据,但前提是两个web页面具有相同的源.此策略防止一个页面的恶意脚 ...

  10. 手把手golang教程【二】——数组与切片

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第五篇,这一篇我们将会了解golang中的数组和切片的使用. 数组与切片 golang当中数组和C++中的定义类似, ...