基于Centos 7搭建MySQL主从复制及读写分离

博文目录
一、MySQL主从复制原理
二、MySQL读写分离原理
三、搭建MySQL主从复制
四、配置MySQL读写分离

在实际生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,一般来说实际生产环境中都是通过主从复制(Master——Slave)的方式来同步数据,再通过读写分离来提升数据库的并发负载能力这样的方案来进行部署与实施的。

如下图所示,一台MySQL主服务器带两台MySQL从服务器做数据复制,前端应用在进行数据库写操作时,对主服务器进行操作;在进行数据库读操作时,对两台从服务器进行操作,这样大大减轻了主服务器的压力。

一、MySQL主从复制原理

MySQL的主从复制和MySQL的读写分离两者有紧密的联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。

1、MySQL支持的复制类型

  • 基于语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。
  • 基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍;
  • 混合类型的复制:默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制;

2、复制的工作过程

MySQL复制的工作过程如图所示:

1)在每个事物更新数据完成之前,Master在二进制日志记录这些变化。写入二进制日志完成后,Master通知存储引擎提交事务。

2)Slave将Master的Binary log复制到其中继日志。首先,Slave开始一个工作进程——I/O线程在Master上打开一个普通的连接,然后开始Binlog dump process(二进制日志转储过程)。Binlog dump process从Master的二进制日志中读取事件,如果已经跟上Master,它就会睡眠并等待Master产生新的事件。I/O线程将这些时间写入中继日志。

3)SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志中读取事件,并重放其中的事件而更新Slave的数据,使其与Master中的数据一致,只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
复制过程有一个很重要的限制,即复制在Slave上是串行化的,也就是说Master上的并行更新操作不能在Slave上并行操作。

二、MySQL读写分离原理

简单来说,读写分离就是只在主服务器上写、只在从服务器上读。基本的原理是让主数据库处理事务性查询,而从数据库处理select查询。数据库复制被用来把事务性查询导致的变更同步到群集中的从数据库。如图所示:

目前常见的MySQL读写分离分为两种:

1、基于程序代码内部实现

在代码中根据select、insert进行路由分类,这类方法也是目前生产环境应用最广泛的。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支,缺点是需要开发人员来实现,运维人员无从下手。

2、基于中间代理层实现

代理一般位于客户端和服务器之间,代理服务器接到客户端的请求后通过判断后转发到后端数据库,有两个代表性程序:
1)MySQL—Proxy:为MySQL开源项目,通过其自带的lua脚本进行SQL判断,虽然是MySQL官方产品。但是MySQL官方并不建议将MySQL—Proxy用到生产环境中。
2)Amoeba(变形虫):由陈思儒开发,其层就职于阿里巴巴。该程序用Java语言进行开发,阿里巴巴将其用于生产环境。它不支持事务和存储过程。

经过上述简单的比较,通过程序代码实现MySQL读写分离自然是一个不错的选择,但是并不是所有的应用都适合在程序代码中实现读写分离。例如:一些大型复杂Java应用,如果在程序代码中实现分离对代码改动较大。所以,像这种代行复杂的应用一般会考虑使用Amoeba来实现。

三、搭建MySQL主从复制

环境如下:

本案例所需镜像及软件请访问网盘:https://pan.baidu.com/s/10jnaPKqkqtG3j1WJEsLx8A
提取码:4j1e

1、安装NTP时间同步服务器

[[email protected] ~]# mount /dev/cdrom /mnt/     <!--挂载操作系统光盘-->
mount: /dev/sr0 写保护,将以只读方式挂载
[[email protected] ~]# rm -rf /etc/yum.repos.d/CentOS-*   <!--删除系统自带yum源-->
[[email protected] ~]# yum -y install ntp    <!--安装NTP时间同步服务器-->
[[email protected] ~]# vim /etc/ntp.conf     <!--编辑NTP主配置文件 -->
restrict 192.168.100.0 mask 255.255.255.0 nomodify notrap<!--允许100.0网络使用NTP服务器-->
server 127.127.1.0       <!--NTP服务器-->
fudge 127.127.1.0 stratum 8       <!--设置时区-->
[[email protected] ~]# systemctl start ntpd      <!--启动ntp服务-->
[[email protected] ~]# systemctl enable ntpd    <!--设置ntp开机自带启动-->

2、安装MySQL及配置主节点

1)安装MySQL服务器

[[email protected] ~]# groupadd mysql      <!--创建管理MySQL数据库的组-->
[[email protected] ~]# useradd -M -s /sbin/nologin mysql -g mysql
                      <!--创建管理MySQL数据库的用户-->
[[email protected] ~]# yum -y install ncurses-devel     <!--安装MySQL依赖软件-->
[[email protected] ~]# umount /mnt/        <!--卸载操作系统光盘-->
[[email protected] ~]# mount /dev/cdrom /mnt/      <!--切换Linux光盘-->
mount: /dev/sr0 写保护,将以只读方式挂载
[[email protected] ~]# tar zxvf /mnt/cmake-2.8.6.tar.gz -C /usr/src/
                             <!--解压缩cmake压缩包到/usr/src/目录-->
[[email protected] ~]# tar zxvf /mnt/mysql-5.5.22.tar.gz -C /usr/src/
                        <!--解压缩mysql压缩包到/usr/src/目录-->
[[email protected] ~]# cd /usr/src/cmake-2.8.6/    <!--进入cmake目录-->
[[email protected] cmake-2.8.6]# ./configure && gmake && gmake install
                           <!--配置cmake编译及安装cmake-->
[[email protected] ~]# cd /usr/src/mysql-5.5.22/       <!--进入mysql目录-->
[[email protected] mysql-5.5.22]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
-DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc     <!--配置MySQL-->
[[email protected] mysql-5.5.22]# make && make install     <!--编辑及安装MySQL-->
[[email protected] mysql-5.5.22]# cp support-files/my-medium.cnf /etc/my.cnf
                                      <!--生成MySQL服务配置文件-->
cp:是否覆盖"/etc/my.cnf"? y      <!--输入y-->
[[email protected] mysql-5.5.22]# cp support-files/mysql.server /etc/init.d/mysqld
                           <!--生成MySQL服务控制文件-->
[[email protected] ~]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile<!--优化执行命令-->
[[email protected] ~]# source /etc/profile       <!--刷新-->
[[email protected] ~]# chmod +x /etc/init.d/mysqld       <!--设置服务执行权限-->
[[email protected] ~]# chown -R mysql:mysql /usr/local/mysql/<!--设置安装目录数据的所有者-->
[[email protected] ~]# chkconfig --add mysqld       <!--添加为系统服务-->
[[email protected] ~]# chkconfig --level 35 mysqld on     <!--设置开机自动启动-->
[[email protected] ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql
--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data <!--初始化MySQL数据库   -->
[[email protected] ~]# systemctl start mysqld       <!--启动MySQL服务-->
[[email protected] ~]# netstat -antpu | grep mysqld      <!--监听MySQL服务-->
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      22053/mysqld
[[email protected] ~]# mysqladmin -uroot password     <!--MySQL数据库设置密码-->
[[email protected] ~]# mysqladmin -uroot [email protected]     <!--测试连接MySQL数据库-->
        <!--远程复制cmake和mysql压缩包到两台从节点服务器-->
[[email protected] ~]# scp /mnt/cmake-2.8.6.tar.gz /mnt/mysql-5.5.22.tar.gz  [email protected]:/root      <!--将cmake、mysql压缩包复制到100.20服务器的根目录-->
The authenticity of host ‘192.168.100.20 (192.168.100.20)‘ can‘t be established.
ECDSA key fingerprint is SHA256:PUueT9fU9QbsyNB5NC5hbSXzaWxxQavBxXmfoknXl4I.
ECDSA key fingerprint is MD5:6d:f7:95:0e:51:1a:d8:9e:7b:b6:3f:58:51:51:4b:3b.
Are you sure you want to continue connecting (yes/no)? yes       <!--输入yes-->
Warning: Permanently added ‘192.168.100.20‘ (ECDSA) to the list of known hosts.
[email protected]‘s password:           <!--输入密码-->
cmake-2.8.6.tar.gz                                                  100% 5453KB  44.0MB/s   00:00
mysql-5.5.22.tar.gz                                                 100%   23MB  57.9MB/s   00:00    

[[email protected] ~]# scp /mnt/cmake-2.8.6.tar.gz /mnt/mysql-5.5.22.tar.gz  [email protected]:/root    <!--将cmake、mysql压缩包复制到100.30服务器的根目录-->
The authenticity of host ‘192.168.100.30 (192.168.100.30)‘ can‘t be established.
ECDSA key fingerprint is SHA256:PUueT9fU9QbsyNB5NC5hbSXzaWxxQavBxXmfoknXl4I.
ECDSA key fingerprint is MD5:6d:f7:95:0e:51:1a:d8:9e:7b:b6:3f:58:51:51:4b:3b.
Are you sure you want to continue connecting (yes/no)? yes   <!--输入yes-->
Warning: Permanently added ‘192.168.100.30‘ (ECDSA) to the list of known hosts.
[email protected]‘s password:      <!--输入密码-->
cmake-2.8.6.tar.gz                                                  100% 5453KB  44.2MB/s   00:00
mysql-5.5.22.tar.gz                                                 100%   23MB  59.2MB/s   00:00   

2)配置MySQL服务器主节点

[[email protected] ~]# vim /etc/my.cnf  <!--修改MySQL主配置文件-->
log-bin=mysql-bin         <!--开启二进制日志-->
log-slave-updates = true     <!--允许从复制日志-->
server-id       = 10         <!--设置master的优先级,数字越小优先级越高-->
[[email protected] ~]# systemctl restart mysqld       <!--重启MySQL服务-->
[[email protected] ~]# netstat -antpu | grep mysqld       <!--监听mysql服务-->
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      22663/mysqld  

[[email protected] ~]# mysql -uroot [email protected]       <!--连接mysql数据库-->
mysql> grant replication slave on *.* to ‘slave‘@‘192.168.100.%‘ identified by ‘[email protected]‘;
          <!--创建主从复制账户名字为slave,密码为[email protected]>
mysql> show master status;        <!--查看Master状态-->
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |      263 |              |                  |
+------------------+----------+--------------+------------------+

3、安装MySQL及配置从节点

1)安装MySQL服务器

         <!--相关注释请参考主节点注释-->
[[email protected] ~]# yum -y install ntpdate         <!--安装时间同步程序-->
[[email protected] ~]# ntpdate 192.168.100.10    <!--MySQL从节点同步主节点时间-->
[[email protected] ~]# groupadd mysql
[[email protected] ~]# useradd -M -s /sbin/nologin mysql -g mysql
[[email protected] ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
[[email protected] ~]# rm -rf /etc/yum.repos.d/CentOS-*
[[email protected] ~]# yum -y install ncurses-devel
[[email protected] ~]# ls
anaconda-ks.cfg  cmake-2.8.6.tar.gz  initial-setup-ks.cfg  mysql-5.5.22.tar.gz
[[email protected] ~]# tar zxvf cmake-2.8.6.tar.gz -C /usr/src/
[[email protected] ~]# tar zxvf mysql-5.5.22.tar.gz -C /usr/src/
[[email protected] ~]# cd /usr/src/cmake-2.8.6/
[[email protected] cmake-2.8.6]# ./configure && gmake && gmake install
[[email protected] ~]# cd /usr/src/mysql-5.5.22/
[[email protected] mysql-5.5.22]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc
[[email protected] mysql-5.5.22]# make && make install
[[email protected] mysql-5.5.22]# cp support-files/my-medium.cnf /etc/my.cnf
[[email protected] mysql-5.5.22]# cp support-files//mysql.server /etc/init.d/mysqld
[[email protected] ~]# echo "PATH=$PATH:/usr/local/mysql/bin/" >> /etc/profile
[[email protected] ~]# source /etc/profile
[[email protected] ~]# chmod +x /etc/init.d/mysqld
[[email protected] ~]# chown -R mysql:mysql /usr/local/mysql/
[[email protected] ~]# chkconfig --add mysqld
[[email protected] ~]# chkconfig --level 35 mysqld on
[[email protected] ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
[[email protected] ~]# systemctl start mysqld
nets[[email protected] ~]# netstat -anptu | grep mysqld
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      35808/mysqld   

2)部署MySQL服务器从节点

[[email protected] ~]# vim /etc/my.cnf   <!--修改MySQL主配置文件-->
log-bin=mysql-bin          <!--开启二进制日志-->
relay-log=relay-log-bin     <!--设置读取日志-->
relay-log-index=slave-relay-bin.index    <!--设置同步主服务器日志-->
server-id       = 11            <!--设置优先级,要比master低-->
[[email protected] ~]# systemctl restart mysqld
[[email protected] ~]# netstat -anptu | grep mysqld
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      36399/mysqld
mysql> change master to master_host=‘192.168.100.10‘,master_user=‘slave‘,
master_password=‘[email protected]‘,master_log_file=‘mysql-bin.000004‘,
master_log_pos=263;   <!--设置从主同步数据-->
mysql> start slave;       <!--启动从服务器-->
mysql> show slave status\G;         <!--查看从服务器状态-->
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.100.10
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 263
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: Yes      <!--必须是yes-->
            Slave_SQL_Running: Yes        <!--必须是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: 263
              Relay_Log_Space: 407
              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: 10
1 row in set (0.00 sec)

ERROR:
No query specified

第二台MySQL从节点自行配置,除了MySQL主配置文件里优先级需要改动其他配置和以上配置一模一样。

4、测试MySQL服务器主从复制

[[email protected] ~]# mysql -uroot [email protected]      <!--主节点登录数据库-->
mysql> create database liyanxin;      <!--在主节点服务器上创建数据库-->
Query OK, 1 row affected (0.00 sec)

mysql> show databases;    <!--查看数据库是否创建成功-->
+--------------------+
| Database           |
+--------------------+
| information_schema |
| liyanxin           |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)
[[email protected] ~]# mysql -uroot [email protected]       <!--从节点登录数据库-->
mysql> show databases;       <!--查看是否自动复制了刚才创建的数据库-->
+--------------------+
| Database           |
+--------------------+
| information_schema |
| liyanxin           |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

[[email protected] ~]# mysql -uroot [email protected]    <!--从节点登录数据库-->
mysql> show databases;        <!--查看是否自动复制了刚才创建的数据库-->
+--------------------+
| Database           |
+--------------------+
| information_schema |
| liyanxin           |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

四、配置MySQL读写分离

1、配置安装JDK环境

[[email protected] ~]# mount /dev/cdrom /mnt/       <!--挂载Linux光盘-->
mount: /dev/sr0 写保护,将以只读方式挂载
[[email protected] ~]# rm -rf /etc/yum.repos.d/CentOS-*   <!--删除系统自带yum源-->
[[email protected] ~]# mkdir /usr/src/jdk   <!--创建安装jdk目录-->
[[email protected] ~]# cp /mnt/jdk-6u14-linux-x64.bin /usr/src/jdk/
                      <!--复制jdk软件到/usr/src/jdk/目录-->
[[email protected] ~]# cd /usr/src/jdk/
[[email protected] jdk]# ./jdk-6u14-linux-x64.bin   <!--配置jdk及安装jdk-->
[[email protected] jdk]# mv ./jdk1.6.0_14/* ./
[[email protected] jdk]# rm -rf jdk1.6.0_14/
[[email protected] ~]# chmod -R 755 /usr/src/jdk/   <!--设置jdk权限-->

2、安装amoeba服务器

[[email protected] ~]# mkdir /usr/src/amoeba       <!--创建amoeba目录-->
[[email protected] ~]# tar zxvf /mnt/amoeba-mysql-binary-2.2.0.tar.gz -C /usr/src/amoeba
                   <!--解压缩amoeba压缩包-->
[[email protected] ~]# chmod -R 755 /usr/src/amoeba/      <!--添加执行权限-->
[[email protected] ~]# java -version         <!--查看java版本-->
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
[[email protected] ~]# vim /etc/profile.d/java.sh   <!--配置环境变量加载jdk和amoeba-->
export JAVA_HOME=/usr/src/jdk/
export CLASSPATH=$CLASSPATH:$JAVA_HOME/LIB:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/src/amoeba/
export PATH=$PATH:$AMOEBA_HOME/bin
[[email protected] ~]# source /etc/profile.d/java.sh   <!--刷新环境变量-->
[[email protected] ~]# java -version        <!--再次查看java版本-->
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)

3、配置amoeba服务器

[[email protected] ~]# mysql -uroot [email protected]          <!--主节点登录mysql数据库-->
mysql> grant all on *.* to ‘bob‘@‘192.168.100.%‘ identified by ‘[email protected]‘;
               <!--配置amoeba登录mysql数据库读取和写入数据权限账户-->
[[email protected] ~]# vim /usr/src/amoeba/conf/amoeba.xml<!--修改amoeba主配置文件-->
30                                         <property name="user">amoeba</property>
               <!--将上面配置默认的“root”改为amoeba,这是客户端连接时使用的用户名-->
 31
 32                                         <property name="password">[email protected]</property>
                 <!--“[email protected]”是用户名amoeba对应的密码-->
114                 <property name="LRUMapSize">1500</property>
115                 <property name="defaultPool">master</property>
116
 <!--将下面两项中默认的“server1”分别改为“master”和“slaves”,如下:-->
117                 <property name="writePool">master</property>
118                 <property name="readPool">slaves</property>
119                 <property name="needParse">true</property>
[[email protected] ~]# vim /usr/src/amoeba/conf/dbServers.xml
              <!--将MySQL主从节点添加到amoeba中-->
26                         <property name="user">bob</property>
   <!--默认的“root”改为bob,这是amoeba连接时数据库时使用的用户名-->
28                         <property name="password">[email protected]</property>
<!--“将默认的“password”改为“[email protected]”,这是刚才在数据库上创建的用户密码-->
43         <dbServer name="master"  parent="abstractServer">
                  <!--将name值改为“master”-->
44                 <factoryConfig>
45                         <property name="ipAddress">192.168.100.10</property>
            <!--上面的IP地址192.168.100.10,为主服务器的IP地址-->
46                 </factoryConfig>
47         </dbServer>
48
         <!--将下面的name值改为“slave01”,如下所示-->
49         <dbServer name="slave01"  parent="abstractServer">
50                 <factoryConfig>
51                         <property name="ipAddress">192.168.100.20</property>
           <!--上面的IP地址192.168.100.20,为从服务器的IP地址-->
52                 </factoryConfig>
53         </dbServer>
54
    <!--将下面的name值改为“slave02”,如下所示-->
55         <dbServer name="slave02"  parent="abstractServer">
56                 <factoryConfig>
57                         <property name="ipAddress">192.168.100.30</property>
     <!--上面的IP地址192.168.100.30,为从服务器的IP地址-->
58                 </factoryConfig>
59         </dbServer>
60
     <!--将下面的name值改为“slaves”,如下所示-->
61         <dbServer name="slaves" virtual="true">
62                 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
63                         <property name="loadbalance">1</property>
64
   <!--
将下面默认的内容改为“slave1,slave2”,如下所示:
这里引用的是上面两个定义的slave1/2的配置项
        -->
65                         <property name="poolNames">server01,server02</property>
66                 </poolConfig>
67         </dbServer>
[[email protected] ~]# /usr/src/amoeba/bin/amoeba start&
                  <!--启动amoeba服务,运行在后台-->
[[email protected] ~]# netstat -anptu | grep 8066   <!--监听amoeba服务否成功运行-->
tcp6       0      0 :::8066                 :::*                    LISTEN      3153/java
[[email protected] ~]# netstat -anptu | grep java   <!--监听java是否成功运行-->
tcp6       0      0 :::8066                 :::*                    LISTEN      3153/java
tcp6       0      0 127.0.0.1:54084         :::*                    LISTEN      3153/java
tcp6       0      0 192.168.100.40:60980    192.168.100.30:3306     ESTABLISHED 3153/java
tcp6       0      0 192.168.100.40:44082    192.168.100.10:3306     ESTABLISHED 3153/java
tcp6       0      0 192.168.100.40:53840    192.168.100.20:3306     ESTABLISHED 3153/java  

4、客户端验证

[[email protected] ~]# mount /dev/cdrom /mnt/    <!--挂载操作系统光盘-->
mount: /dev/sr0 写保护,将以只读方式挂载
[[email protected] ~]# rm -rf /etc/yum.repos.d/CentOS-*    <!--删除系统自动yum源-->
[[email protected] ~]# yum -y install mysql     <!--安装mysql客户端-->
[[email protected] ~]# mysql -uamoeba [email protected] -h192.168.100.40 -P8066
                <!--客户端测试连接amoeba服务器-->
MySQL [(none)]> create database benet;
           <!--客户端通过amoeba服务器在MySQL创建数据库 -->
[[email protected] ~]# mysql -uroot [email protected]
                <!--在主节点从节点服务器查看是否创建成功-->
mysql> show databases;     <!--查看数据库-->
+--------------------+
| Database           |
+--------------------+
| information_schema |
| benet              |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)
MySQL [(none)]> create table student (姓名 char(10),性别 char(3),年龄 char(4),电话
char(13),primary key(电话) );     <!--客户端通过amoeba服务器在MySQL创建表-->
MySQL [(none)]> use benet;     <!--切换到benet数据库-->
MySQL [benet]> insert into benet.student value (‘马云‘,‘男‘,‘40‘,‘110120119114‘);<!--表中插入数据-->
[[email protected] ~]# mysql -uroot [email protected]    <!--从节点连接数据库-->
mysql> select * from benet.student;      <!--从节点查看表中数据-->
+--------+--------+--------+--------------+
| 姓名   | 性别   | 年龄   | 电话         |
+--------+--------+--------+--------------+
| 马云   | 男     | 40     | 110120119114 |
+--------+--------+--------+--------------+

9)模拟从节点故障,客户端通过amoeba服务器继续写入数据
[[email protected] ~]# mysql -uroot [email protected]    <!--从节点连接数据库-->
mysql> slave stop;    <!--模拟从节点故障-->
[[email protected] ~]# mysql -uroot [email protected]     <!--从节点连接数据库-->
mysql> slave stop;    <!--模拟从节点故障-->
[[email protected] ~]# mysql -uamoeba [email protected] -h192.168.100.40 -P8066
                     <!--客户端连接amoeba服务器-->
MySQL [(none)]> use benet;    <!--切换到benet数据库-->
MySQL [benet]> insert into benet.student value (‘彤彤‘,‘女‘,‘18‘,‘22222222222‘);
               <!--客户端通过amoeba服务器继续写入数据-->
[[email protected] ~]# mysql -uroot [email protected]    <!--主节点连接数据库-->
mysql> select * from benet.student;    <!--查看benet数据库中的student表-->
+--------+--------+--------+--------------+
| 姓名   | 性别   | 年龄   | 电话         |
+--------+--------+--------+--------------+
| 马云   | 男     | 40     | 110120119114 |
| 彤彤   | 女     | 18     | 22222222222  |
+--------+--------+--------+--------------+

[[email protected] ~]# mysql -uroot [email protected]    <!--从节点连接数据库-->
mysql> select * from benet.student;     <!--查看benet数据库中的student表-->
+--------+--------+--------+--------------+
| 姓名   | 性别   | 年龄   | 电话         |
+--------+--------+--------+--------------+
| 马云   | 男     | 40     | 110120119114 |
+--------+--------+--------+--------------+

[[email protected] ~]# mysql -uamoeba [email protected] -h192.168.100.40 -P8066
MySQL [benet]> select * from benet.student;          <!--查看benet数据库中的student表-->
+--------+--------+--------+--------------+
| 姓名   | 性别   | 年龄   | 电话         |
+--------+--------+--------+--------------+
| 马云   | 男     | 40     | 110120119114 |
+--------+--------+--------+--------------+

至此MySQL主从复制+读写分离已经完全实现......

—————— 本文至此结束,感谢阅读 ——————

原文地址:https://blog.51cto.com/14156658/2459841

时间: 2024-11-05 09:32:39

基于Centos 7搭建MySQL主从复制及读写分离的相关文章

搭建 MySQL主从复制与读写分离

搭建 MySQL主从复制与读写分离 案例概述 : 在实际环境中 ,如果对数据库的读和写都在同一个数据库服务中操作 ,无论实在安全性.高可用性, 还是高并发等各个方面都是完全不能满足实际需求的 ,因此 ,一般来说都只通过主从复制的方式来同 步数据 ,在通过读写分离来提升数据库的并发负载能力 ,这样的方案来进行部署与实施 . 环境拓补图 : 本案环境 : 主机 操作系统 IP地 址 主要软件 主服务器 CentOS 7.3 x86_64 192.168.217.130 NTP 从服务器1 CentO

在CentOS7上搭建MySQL主从复制与读写分离

MySQL主从复制原理 MySQL的主从复制和MySQL的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离. (1)MySQL支持复制的类型. 1)基于语句的复制.MySQL默认采用基于语句的复制,效率比较高. 2)基于行的复制.把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 3)混合类型的复制.默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制. (2)MySQL复制的工作过程如图所示.1)在每个事务更新数据

MySQL主从复制、读写分离、高可用集群搭建

MySQL主从复制.读写分离.高可用集群搭建  一.服务介绍   1.1 Keepalived     Keepalived,见名知意,即保持存活,其目的是解决单点故障,当一台服务器宕机或者故障时自动切换到其他的服务器中.Keepalived是基于VRRP协议实现的.VRRP协议是用于实现路由器冗余的协议,VRRP协议将两台或多台路由器设备虚拟成虚拟设备,可以对外提供虚拟路由器IP(一个或多个),即漂移IP(VIP). 1.2 ProxySQL ProxySQL是一个高性能,高可用性的MySQL

MySQL 主从复制与读写分离

Mysql主从复制作用原理 1.在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作.2.做数据的热备3.架构的扩展.业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能.mysql主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记

重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践

一.MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量. 关于数据库的扩展主要包括:业务拆分.主从复制.读写分离.数据库分库与分表等.这篇文章主要讲述数据库分库与分表 (1)业务拆分 在?大型网站应用之海量数据和高并发解决方案总结一二?一篇文章中也具体讲述了为什么要对业务进行拆分. 业务起步初始,为了加快应用上线和快速迭代,很多应用都采用集中式的架构.随着业务系统的扩大,系统变得越来越复杂,越来越难以维护,开发效率变得越

Mysql 主从复制,读写分离

Mysql 主从复制及读写分离 特别推荐看:amoeba.xml 的配置部分,在百度上看了很多配置都不完整,是我测试时的痛点 实验的目的: 有两部分:第一实现Mysql主从复制,第二实现读写分离. 下面是实验的环境: 192.168.58.11     安装了amoeba 的节点 192.168.58.16      master    系统:rhel 5.4 192.168.58.12      slave     系统: rhel 5.4 192.168.58.11      代理     

搭建MySQL代理服务器实现读写分离+主从同步

实验需求: 1.配置2台MySQL服务器(192.168.100.2,192.168.100.3)+1台代理服务器(192.168.100.1),实现MySQL代理的读写分离. 2.用户只需要访问MySQL代理服务器,实际的SQL查询.写入操作交给后台的2台MySQL服务器来完成. 3.2台MySQL服务器实现主从同步,其中Master服务器允许SQL查询.写入,Slave服务器只允许SQL查询. 一 .MASTER数据库服务器(192.168.100.2)的配置 1.安装软件包(本实验采用My

mysql主从复制与读写分离

MySQL主从复制与读写分离 MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面. 因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部

Mysql主从复制、读写分离工作原理+配置

Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysqlinstance(我们称之 Slave).在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在 Master 端. MySQL 复制的基本过程如下: 1. Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开