mysql的主从复制

mysql 的主从复制

Mysql 的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysqlinstance(我们称之 Slave)。在 Master 与Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql 线程和 IO 线程)在 Slave 端,另外一个线程(IO 线程)在 Master 端。


MySQL 复制的基本过程如下:

1. Slave 上面的 IO 线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;


2. Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO 线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在Master 端的 BinaryLog 文件的名称以及在 Binary Log 中的位置;


3. Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的 Relay Log 文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的 Master 端的bin-log 的文件名和位置记录到 master- info 文件中,以便在下一次读取的时候能够清楚的高速 Master“我需要从某个 bin-log 的哪个位置开始往后的日志内容,请发给我”


4. Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该Log 文件中的内容成为在 Master 端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。这样,实际上就是在 Master 端和 Slave 端执行了同样的 Query,所以两端的数据是完全一样的。


实验环境:

RHEL 6:mysql-server-5.1.71-1.el6.x86_64
master 172.25.80.1
slave1 172.25.80.2
slave2 172.25.80.3
注意: mysql 数据库的版本,两个数据库版本要相同,或者 slave 比 master 版本高!mysql 软件可以安装源码或是 rpm 包都可以,由于 RHEL6 自带mysql 软件包,直接 yum 安装。我选择系统自带的软件包。


在 master slave 上安装 mysql 软件:

[root@server1 ~]# yum install mysql mysql-server -y                 ##安装


一 ,mysql master 的配置:

(1)编辑配置文件/etc/my.cnf,并作如下修改:
在[mysqld]下添加这些参数:
5 log-bin=mysql-bin             ##启动二进制日志
6 binlog-do-db=test             ##二进制需要同步的数据库名。如需添加多个库,以此类推。
7 server-id=1                        ##唯一确定的 id(1~231 的数正整数),不能和从服务器 id 号一样
8 binlog-ignore-db=mysql   ##禁止 mysql 数据库


(2)启动 master 的 mysql:[root@server1 ~]# /etc/init.d/mysqld start

Starting mysqld:                                                                                                   [ OK ]


(3)创建同步帐户,并给予权限:

mysql> grant relication slave on *.* to 'westos'@'172.25.80.2mysql> grant replication
slave,reload,super on *.* to 'westos'@'172.25.80.2' identified by 'westos';
Query OK, 0 rows affected (0.00 sec)        ##增加 mysql 帐号,并设置权限和密码
mysql> flush privileges;                             ##刷新数据使其生效
Query OK, 0 rows affected (0.00 sec)


调试:

在 master 用下面命令查看:
mysql> show master status;                        ##在主服务上查看二进制日志的文件名和日志位置
+------------------+----------+--------------+------------------+
| File
| Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |
348 | test
| mysql
|
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)                                   ##显示记录 file 和 position 的值


二.slave1 server 的配置:

安装与 master 上版本相同的数据库。
(1)编辑配置文件//etc/my.cnf,并做如下修改:
在[mysqld]下添加这个参数:
5 server-id=2             ##从服务器 id 号也必须是唯一确定的,不能与主服务器和其他的从服务器的 id 一样


(2)在 slave1 上启动 mysql:

[root@server2 ~]# service mysqld start
Starting mysqld:                                                              [ OK ]


(3)在 slave 上执行如下命令:

mysql>
change
master
to
master_host='172.25.80.1',master_user='westos',master_password='westos',master_lo
g_file='mysql-bin.000001',master_log_pos=348;                       ##添加复制数据的主服务器的ip,用户和密码,以及二进制日志名和位置
Query OK, 0 rows affected (0.37 sec)


以下开启复制功能了,slave 状态为非空:



mysql> show slave status\G;
                         *************************** 1. row ***************************
                                Slave_IO_State: Waiting for master to send event
                                                  Master_Host: 172.25.80.1
                                                  Master_User: westos
                                                    Master_Port: 3306
                                                     Connect_Retry: 60
                                        Master_Log_File: mysql-bin.000002
                                              Read_Master_Log_Pos: 106
                                    Relay_Log_File: mysqld-relay-bin.000004
                                                      Relay_Log_Pos: 251
                                    Relay_Master_Log_File: mysql-bin.000002

                                                     Slave_IO_Running: Yes
                                                     Slave_SQL_Running: Yes
                                                                                    ......
如果都是 yes,表示从库的 I/O,Slave_SQL 线程都正确开启.表明数据库正在同步。


    一开始,我执行上面那一条命令后,I/O 和 Slave_SQL 都是 No,然后我用名令:/etc/init.d/mysqld status 分别先后查看主,从服务器的数据库的状态,发现都是running,接着我用命令:/etc/init.d/mysqld restart 非别先后重启了主,从服务器的 数 据 库 , 最 后 , 我 再 在 从 服 务 器 执 行 命 令 : show slave status\G 后 ,
I/O,Slave_SQL 都 Yes.

(4)编辑配置文件:/etc/init.d/my.cnf,并作添加以下内容:
[root@server2 ~]# vim /etc/my.cnf
6 log-bin=mysql-bin
7 binlog-ignore-db=mysql
8 binlog-do-db=test
9 log-slave-updates
[root@server2 ~]# /etc/init.d/mysqld restart ##每次对数据库的配置文件做修改后,都应重启,使修改内容生效
Stopping mysqld:                                                                        [ OK ]
Starting mysqld:                                                                          [ OK ]


(5)在 slave1 上创建同步帐户,并给予权限:
[root@server2 ~]# mysql
mysql> grant replication slave,reload,super on *.* to westos@'172.25.80.2' identified
by 'westos';
Query OK, 0 rows affected (0.00 sec)               ##增加 mysql 帐号,并设置权限和密码
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)              ##刷新数据使其生效
mysql> show master status;
+------------------+----------+--------------+------------------+
| File
| Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |
346 | test
| mysql
|
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)


三.slave2 server 的配置:安装与 master 上版本相同的数据库。
(1)编辑配置文件:/etc/init.d/my.cnf,并添加如下内容:
[root@server3 ~]# vim /etc/my.cnf
5 server-id=3                                           ##同样,这个从服务器的 id 也是唯一确定的
[root@server3 ~]# /etc/init.d/mysqld start                               ##启动数据库
Starting mysqld:                                                                           [ OK ]


(2)在 slave2 上以下执行命令:
mysql>
change
master
to
master_host='172.25.80.2',master_user='westos',master_password='westos',master_lo
g_file='mysql-bin.000001',master_log_pos=106;        ##添加复制数据的主服务器的ip,用户和密码,以及二进制日志名和位置
Query OK, 0 rows affected (0.49 sec)
mysql> slave start;                                          ##开启 slave 服务
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show slave status\G;
                                   *************************** 1. row ***************************
                                                Slave_IO_State: Connecting to master
                                                           Master_Host: 172.25.80.2
                                                                 Master_User: westos
                                                                   Master_Port: 3306
                                                                   Connect_Retry: 60
                                                        Master_Log_File: mysql-bin.000001
                                                                 Read_Master_Log_Pos: 106
                                                         Relay_Log_File: mysqld-relay-bin.000003
                                                                        Relay_Log_Pos: 4
                                                          Relay_Master_Log_File: mysql-bin.000001
                                                                      Slave_IO_Running: Yes
                                                                   Slave_SQL_Running: Yes##开启 slave 服务后,这两个进程自动启动
                                                                                 ......
测试:
在 master 上创建一个名叫 redhat 的表,很快就在 slave1 和 slave2 上看到:



mysql 的读写分离:
我们的从服务上如果也可以进行数据库的写入操作,一旦用户把数据写入到从服务器的数据库内,然后从服务器从主服务器上同步数据库的时候,会造成数据错乱,从而会造成数据的损坏,所以我们需要把从服务器设置成只读,
而主服务器可以进行读操作。


数据库 master 主服务器:172.25.80.1
数据库 slave 从服务器:172.25.80.2
MySQL-Proxy 调度服务器:172.25.80.3


以下操作,均是在 172.25.80.3 即 MySQL-Proxy 调度服务器 上进行的:
(1)检查系统所需软件包
通过 rpm -qa | grep name 的方式验证以下软件包是否已全部安装。
gcc* gcc-c++* autoconf* automake* zlib* libxml* ncurses-devel* libmcrypt*
libtool* flex*
pkgconfig*
libevent* glib*
若缺少相关的软件包,可通过 yum -y install 方式在线安装,或直接从系统安装光盘中找到并通过 rpm -ivh 方式安装。
[root@server3 ~]# yum install gcc* gcc-c++* autoconf* automake* zlib* libxml*
ncurses-devel* libmcrypt* libtool* flex* pkgconfig* libevent* glib* -y


(2)编译安装 lua
MySQL-Proxy 的读写分离主要是通过 rw-splitting.lua 脚本实现的,因此需要安装lua。
这里我采用源码包进行安装(我用的这个源码包版本比较陈旧,最新的已经出到了 5.3.4):
[root@server3 install]# ls                                         ##显示内容
lua-5.1.4.tar.gz
[root@server3 install]# pwd                                     ##显示当前目录/opt/install
[root@server3 install]# tar zxf lua-5.1.4.tar.gz         ##解压
[root@server3 install]# ls                                          ##显示内容
lua-5.1.4 lua-5.1.4.tar.gz
[root@server3 install]# cd lua-5.1.4                           ##进入目录
[root@server3 lua-5.1.4]# vim src/Makefile               ##编辑配置文件
##这一行记录里加上-fPIC。
修改前:
CFLAGS= -O2 -Wall $(MYCFLAGS)
修改后:
CFLAGS= -O2 -Wall -fPIC $(MYCFLAGS)
[root@server3 lua-5.1.4]# make linux                               ##编译
cd src && make linux
make[1]: Entering directory `/opt/install/lua-5.1.4/src'
make all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline
-lhistory -lncurses"
make[2]: Entering directory `/opt/install/lua-5.1.4/src'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/opt/install/lua-5.1.4/src'
make[1]: Leaving directory `/opt/install/lua-5.1.4/src'
[root@server3 lua-5.1.4]# make install                            ##安装
cd src && mkdir -p /usr/local/lua/bin /usr/local/lua/include /usr/local/lua/lib
/usr/local/lua/man/man1 /usr/local/lua/share/lua/5.1 /usr/local/lua/lib/lua/5.1
cd src && install -p -m 0755 lua luac /usr/local/lua/bin
cd src && install -p -m 0644 lua.h luaconf.h lualib.h lauxlib.h ../etc/lua.hpp
/usr/local/lua/include
cd src && install -p -m 0644 liblua.a /usr/local/lua/lib
cd doc && install -p -m 0644 lua.1 luac.1 /usr/local/lua/man/man1
[root@server3 lua-5.1.4]#

注:在 make linux 这里可能会出现报错,有网友说少了依赖包:readline-devel
ncurses-devel ,也有网友是这么解决的:在/opt/install/lua-5.1.4/Makefile 这个文
件 里 添 加 : CFLAGS= -O2 -Wall $(MYCFLAGS) -I/usr/local/lib/readline/include
和MYLDFLAGS=-L/usr/local/lib/readline/lib,还有在:/opt/install/lua-5.1.4/scr/Makefile 这 个 文 件 里 添 加 : INSTALL_TOP =/usr/local/ufo/lua。最后他们都解决了问题。

[root@server3 lua-5.1.4]# cp etc/lua.pc /usr/lib/pkgconfig/           ##复制文件到指定目录


[root@server3lua-5.1.4]#export  PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/pkgconfig/


(3)安装配置 MySQL-Proxy
[root@server3 ~]# tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz    ##解压

[root@server3 ~]# mv mysql-proxy-0.8.5-linux-el6-x86-64bit /opt/mysql-proxy/

创建 mysql-proxy 服务管理脚本:
[root@server3 ~]# mkdir /opt/mysql-proxy/init.d/
[root@server3 ~]# vim mysql-proxy                                                              ##编辑脚本
[root@server3 ~]# cp mysql-proxy /opt/mysql-proxy/init.d/                       ##复制脚本
[root@server3 ~]# chmod +x /opt/mysql-proxy/init.d/mysql-proxy           ##给脚本可执行权限
[root@server3 ~]# mkdir /opt/mysql-proxy/run                                            ##创建目录
[root@server3 ~]# mkdir /opt/mysql-proxy/log
[root@server3 ~]# mkdir /opt/mysql-proxy/scripts
配置并使用 rw-splitting.lua 读写分离脚本最新的脚本可以从最新的 mysql-proxy 源码包中获取
[root@server3 ~]# cd /opt/install/                                             ##进入目录
[root@server3 install]# ls                                                           ##显示内容
lua-5.1.4
mysql-proxy-0.8.5.tar.gz
lua-5.1.4.tar.gz
[root@server3 install]# tar zxf mysql-proxy-0.8.5.tar.gz          ##解压
[root@server3 install]# ls                                                          ##显示内容
lua-5.1.4
mysql-proxy-0.8.5
lua-5.1.4.tar.gz mysql-proxy-0.8.5.tar.gz
[root@server3 mysql-proxy-0.8.5]# cp lib/rw-splitting.lua /opt/mysql-proxy/scripts/   ##复制文件
[root@server3 mysql-proxy-0.8.5]# vim /opt/mysql-proxy/scripts/rw-splitting.lua       ##编辑配置文件,并做以下修改:
40min_idle_connections = 1,                                                       ##默认为 8
41max_idle_connections = 1,                                                      ##默认为 8
[root@server3 mysql-proxy-0.8.5]# /opt/mysql-proxy/init.d/mysql-proxy start      ##启动

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值