mysql主从复制 读写分离

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

MySQL是开源的关系型数据库系统。复制(Replication)是从一台MySQL数据库服务器(主服务器master)复制数据到另一个服务器(从服务器slave)的一个进程



实验环境

CentOS6.8_x64

192.168.1.109  mysql_master/amoeba

192.168.1.111  mysql_slave


实验软件

epel-release-6-8.noarch.rpm

jdk-7u80-linux-x64.tar.gz

amoeba-mysql-3.0.5-RC-distribution.zip 


软件安装

rpm -ivh epel-release-6-8.noarch.rpm 

sed -i 's/^mirrorlist=https/mirrorlist=http/' /etc/yum.repos.d/epel.repo 

wget -C http://mirrors.163.com/.help/CentOS6-Base-163.repo  /etc/yum.repos.d

yum clean all

yum makecache -y

yum install -y ld-linux.so.2* glibc-* nss-*  unzip*

yum install -y mysql mysql-devel mysql-server

unzip amoeba-mysql-3.0.5-RC-distribution.zip

mv amoeba-mysql-3.0.5-RC /usr/local/amoeba

tar zxvf jdk-7u80-linux-x64.tar.gz

mv jdk1.7.0_80 /usr/local/java


vim /etc/profile

export JAVA_HOME="/usr/local/java"

export CLASS_PATH="$JAVA_HOME/lib:$JAVA_HOME/jre/lib"

export PATH=".:$PATH:$JAVA_HOME/bin"

export CATALINA_HOME="/usr/local/tomcat"

export JAVA_HOME CATALINA_HOME    最后一行写入

source /etc/profile        


java  -version

java version "1.7.0_80"

Java(TM) SE Runtime Environment (build 1.7.0_80-b15)

Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)

You have new mail in /var/spool/mail/root  说明jdk安装成功

 

   

/etc/rc.d/init.d/mysqld restart

mysqladmin -uroot password 数据库密码


ps -e | grep mysqld

3045 pts/0    00:00:00 mysqld_safe

3147 pts/0    00:00:00 mysqld


netstat -tuplna | grep mysqld

tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      3147/mysqld     


mysql --version

mysql  Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1


mysql -uroot -p 数据库密码

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 3

Server version: 5.1.73 Source distribution

mysql>          以上操作master slave端都是一致


cp /etc/my.cnf /etc/my.cnf.bak

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

server-id=1      

log-bin=mysql-bin  master端添加2行配置

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0 

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid


service mysqld restart

Stopping mysqld:                                           [  OK  ]

Starting mysqld:                                           [  OK  ]

看到这个选项证明配置没有问题


cp /etc/my.cnf /etc/my.cnf.bak

vim /etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

server_id = 2   slave添加几行配置

log-bin = mysql-bin

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid


service mysqld restart

Stopping mysqld:                                           [  OK  ]

Starting mysqld:                                           [  OK  ]

看到这个提示系统文件配置没问题


mysql -uroot -p  

Enter password: 

mysql> grant replication slave on *.* to 'root'@'192.168.1.111' identified by '123456';

mysql> flush privileges;

mysql> show master status;

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

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

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

| mysql-bin.000001 |      323 |              |                  |

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

1 row in set (0.00 sec)            master端操作


mysql -uroot -p                 slave端操作

Enter password: 

mysql> stop slave;

mysql> reset slave;

mysql> change master to

    -> master_host='192.168.1.109',   master端ip

    -> master_user='root',         master端数据库用户名

    -> master_password='123456',     master端数据库密码

    -> master_log_file='mysql-bin.000001',

    -> master_log_pos=323;          这两个文件按照master端实际情况而定,次操作为slave端

mysql> start slave;

mysql> show slave status\G

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.1.109

                  Master_User: root

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000001

          Read_Master_Log_Pos: 323

               Relay_Log_File: mysqld-relay-bin.000003

                Relay_Log_Pos: 468

        Relay_Master_Log_File: mysql-bin.000001

             Slave_IO_Running: 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: 323

              Relay_Log_Space: 624

              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: 

1 row in set (0.00 sec)


netstat -tuplna | grep mysqld

tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      22233/mysqld        

tcp        0      0 192.168.1.109:3306          192.168.1.111:41406         ESTABLISHED 22233/mysqld   



测试主从同步

在master端执行{create inster}等操作查看数据库slave端是否同步


mysql> show databases;

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

| Database           |

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

| information_schema |

| mysql              |

| test               |

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

3 rows in set (0.06 sec)        master端


mysql> create database test_1

mysql> show databases;

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

| Database           |

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

| information_schema |

| mysql              |

| test               |

test_1             |

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

4 rows in set (0.00 sec)      master端


mysql> show databases;

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

| Database           |

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

| information_schema |

| mysql              |

| test               |

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

3 rows in set (0.00 sec)      slave端


mysql> show databases;

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

| Database           |

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

| information_schema |

| mysql              |

| test               |

test_1             |

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

4 rows in set (0.00 sec)   slave端 看到此提示证明master已经可以和slave同步数据了


cp /usr/local/amoeba/conf/dbServers.xml /usr/local/amoeba/conf/dbServers.xml.bak

cp /usr/local/amoeba/conf/amoeba.xml /usr/local/amoeba/conf/amoeba.xml.bak


vim /usr/local/amoeba/conf/dbServers.xml


<!-- mysql port -->

<property name="port">3306</property>


<!-- mysql schema -->

<property name="schema">test</property>  初始化默认库


<!-- mysql user -->

<property name="user">test1</property> 创建用户连接test数据库


<property name="password">123456</property> 授权用户密码

                </factoryConfig>


 <poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">

               <property name="maxActive">500</property> 最大连接数

               <property name="maxIdle">500</property>  最大空闲连接数

               <property name="minIdle">1</property>   最新空闲连接数


<dbServer name="writedb"  parent="abstractServer">

           <factoryConfig>

                 <!-- mysql ip -->

                 <property name="ipAddress">192.168.1.109</property> 

           </factoryConfig>

        </dbServer>       master端ip_数据库读


<dbServer name="slave"  parent="abstractServer">

            <factoryConfig>

                  <!-- mysql ip -->

                  <property name="ipAddress">192.168.1.111</property>

            </factoryConfig>

        </dbServer>


<dbServer name="myslave" virtual="true">  定义虚拟数据库服务器

<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

         <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->

               <property name="loadbalance">1</property>

               算法,1表示复制均衡,2表示权重,3表示HA              

      <!-- Separated by commas,such as: server1,server2,server1 -->

                   <property name="slave">server1</property>

                </poolConfig>

        </dbServer>

</amoeba:dbServers>


vim /usr/local/amoeba/conf/amoeba.xml

<property name="port">8066</property>  服务端口

    <!-- bind ipAddress -->

    <!-- 

   <property name="ipAddress">127.0.0.1</property>

    -->


<property name="user">root</property>

<property name="password">123456</property> 客户端连接amoeba 账号密码


/usr/local/amoeba/bin/launcher &  启动服务

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:606)

at org.codehaus.plexus.classworlds.launcher.Launcher.launchStandard(Launcher.java:329)

at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:239)

at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)

at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:127)

at org.codehaus.classworlds.Launcher.main(Launcher.java:110)

 2017-07-25 18:39:07 [INFO] Project Name=Amoeba-MySQL, PID=2510 , System shutdown ....

 2017-07-25 18:39:31 [INFO] Project Name=Amoeba-MySQL, PID=2535 , starting...

log4j:WARN log4j config load completed from file:/usr/local/amoeba/conf/log4j.xml

2017-07-25 18:39:37,691 INFO  context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-3.0.4-BETA


netstat -unlpt | grep java

tcp        0      0 :::8066                     :::*          LISTEN      1602/java



实验中用root用户用于实验,生产环境不可做此操作。如果有3-5台mysql可以使用MHA mysql高可用解决方案

grant replication slave on *.* to 'root'@'192.168.1.111' identified by '123456';

192.168.1.111  为slave 数据库ip 

123456       为slave 数据库密码  




本文转自 mailfile 51CTO博客,原文链接:http://blog.51cto.com/mailfile/1272623,如需转载请自行联系原作者

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
7月前
|
SQL 关系型数据库 MySQL
如何实现 MySQL 的读写分离?
本文介绍了 MySQL 读写分离的实现方式及其主从复制原理,解释了如何通过主从架构提升读并发能力。重点分析了主从同步延时问题及解决方案,如半同步复制、并行复制等技术手段,并结合实际案例探讨了高并发场景下的优化策略。文章还提醒开发者在编写代码时需谨慎处理插入后立即查询的情况,避免因主从延时导致的数据不一致问题。
925 44
如何实现 MySQL 的读写分离?
|
11月前
|
SQL 关系型数据库 MySQL
mysql主从复制概述和配置
【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
357 1
|
11月前
|
监控 关系型数据库 MySQL
深入了解MySQL主从复制:构建高效稳定的数据同步架构
深入了解MySQL主从复制:构建高效稳定的数据同步架构
306 1
|
7月前
|
SQL 网络协议 关系型数据库
MySQL 主从复制
主从复制是 MySQL 实现数据冗余和高可用性的关键技术。主库通过 binlog 记录操作,从库异步获取并回放这些日志,确保数据一致性。搭建主从复制需满足:多个数据库实例、主库开启 binlog、不同 server_id、创建复制用户、从库恢复主库数据、配置复制信息并开启复制线程。通过 `change master to` 和 `start slave` 命令启动复制,使用 `show slave status` 检查同步状态。常见问题包括 IO 和 SQL 线程故障,可通过重置和重新配置解决。延时原因涉及主库写入延迟、DUMP 线程性能及从库 SQL 线程串行执行等,需优化配置或启用并行处理
205 40
|
7月前
|
关系型数据库 MySQL 数据库
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
随着数据量增长和业务扩展,单个数据库难以满足需求,需调整为集群模式以实现负载均衡和读写分离。MySQL主从复制是常见的高可用架构,通过binlog日志同步数据,确保主从数据一致性。本文详细介绍MySQL主从复制原理及配置步骤,包括一主二从集群的搭建过程,帮助读者实现稳定可靠的数据库高可用架构。
399 9
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
|
11月前
|
负载均衡 监控 关系型数据库
MySQL 官宣:支持读写分离了!!
【10月更文挑战第8天】MySQL的读写分离功能显著提升了数据库性能、可用性和可靠性。通过将读写操作分配至不同服务器,有效减轻单个服务器负载,提高响应速度与吞吐量,并增强系统稳定性。此外,它还支持便捷的扩展方式,可通过增加只读服务器提升读操作性能。实现读写分离的方法包括软件层面(如使用数据库中间件)和硬件层面(使用独立服务器)。使用时需注意数据一致性、负载均衡及监控管理等问题。
507 0
|
7月前
|
SQL 存储 关系型数据库
MySQL主从复制 —— 作用、原理、数据一致性,异步复制、半同步复制、组复制
MySQL主从复制 作用、原理—主库线程、I/O线程、SQL线程;主从同步要求,主从延迟原因及解决方案;数据一致性,异步复制、半同步复制、组复制
661 11
|
9月前
|
关系型数据库 MySQL 数据库
docker高级篇(大厂进阶):安装mysql主从复制
docker高级篇(大厂进阶):安装mysql主从复制
207 24
|
9月前
|
NoSQL 关系型数据库 Redis
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
239 14
|
11月前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
1086 1
MySQL主从复制原理和使用

推荐镜像

更多