关系型数据库MySQL主从同步-读写分离
1.环境准备
我的数据库版本是MySQL 5.6
MySQL主机至少两个实例,可以是多实例,可以是多台主机
关闭selinux,关闭防火墙等基础优化
2.安装
yum -y install make gcc-c++ cmake bison-devel ncurses-devel
wget https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.43-linux-glibc2.12-i686.tar.gz
tar xf mysql-5.6.-linux-glibc2.-i686.tar.gz
cd mysql-5.6.-linux-glibc2.-i686
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE= -DWITH_INNOBASE_STORAGE_ENGINE= -DWITH_MEMORY_STORAGE_ENGINE= -DWITH_READLINE= -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock -DMYSQL_TCP_PORT= -DENABLED_LOCAL_INFILE= -DWITH_PARTITION_STORAGE_ENGINE= -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
make && make install
useradd -g mysql mysql
chown -R mysql:mysql /usr/local/mysql
3.多实例
192.168.0.11:3308主
192.168.0.11:3309从
安装数据库
mkdir /data/mysql56/mysql{,}/data -p
/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql56/mysql3308/data #两个ok说明成功
/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql56/mysql3309/data
配置文件
vim /data/mysql56/mysql3308/my.cnf
[client]
port =
socket = /data/mysql56/mysql3308/mysql.sock
default-character-set = utf8
[mysqld]
skip-name-resolve
user = mysql
basedir = /usr/local/mysql
datadir = /data/mysql56/mysql3308/data
port =
server_id =
socket = /data/mysql56/mysql3308/mysql.sock
pid-file = /data/mysql56/mysql3308/mysql.pid
log-error = /data/mysql56/mysql3308/mysql.err
log-bin = /data/mysql56/mysql3308/mysql-bin
character-set-server = utf8 vim /data/mysql56/mysql3309/my.cnf
[client]
port =
socket = /data/mysql56/mysql3309/mysql.sock
default-character-set = utf8
[mysqld]
skip-name-resolve
user = mysql
basedir = /usr/local/mysql
datadir = /data/mysql56/mysql3309/data
port =
server_id =
socket = /data/mysql56/mysql3309/mysql.sock
pid-file = /data/mysql56/mysql3309/mysql.pid
log-error = /data/mysql56/mysql3309/mysql.err
log-bin = /data/mysql56/mysql3309/mysql-bin
character-set-server = utf8
启动脚本
#!/bin/bash
mysql_bin=/usr/local/mysql//bin
mysql_port=
mysql_username="root"
mysql_password=""
mysql_dir=/data/mysql56/mysql${mysql_port}
is_run=$(ss -tunlp|grep ${mysql_port}|wc -l) start_server(){
$mysql_bin/mysqld_safe --defaults-file=${mysql_dir}/my.cnf >& > /dev/null &
echo "已经运行"
}
stop_server(){
if [ ${is_run} -eq ];then
$mysql_bin/mysqladmin -u ${mysql_username} -p${mysql_password} -S ${mysql_dir}/mysql.sock shutdown
echo "已经停止"
else
echo "是停止的"
fi
}
restart_server(){
if [ ${is_run} -eq ];then
echo "正在重启"
stop_server
sleep
start_server
echo "重启完毕"
else
start_server
fi
}
case $ in
start)
start_server;;
stop)
stop_server;;
restart)
restart_server;;
*)
echo "Usage: $0 {start|stop|restart|}";;
esac
mysqladmin -uroot password 123456 -S /data/mysql56/mysql3308/mysql.sock #密码设置得和脚本一致
登录
/data/mysql56/mysql3308/mysql-server.sh start
mysql -uroot -p123456 -S /data/mysql56/mysql3308/mysql.sock
成功~
启动另一个实例
把脚本的端口改一下就可以了
cp /data/mysql56/mysql3308/mysql-server.sh /data/mysql56/mysql3309/
cd /data/mysql56/mysql3309/
./mysql-server.sh start
4.主从同步
1.登录主库
创建用户同步的用户
mysql> grant replication slave on *.* to rep@'192.168.0.%' identified by 'rep123';
mysql> flush privileges; 查看
mysql> show grants for rep@'192.168.0.%';
+--------------------------------------------------------------------------------------------------------------------------+
| Grants for rep@192.168..% |
+--------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'rep'@'192.168.0.%' IDENTIFIED BY PASSWORD '*08F5BB4670F148DB0376A1EE646F0C67EAE138CE' |
+--------------------------------------------------------------------------------------------------------------------------+
row in set (0.00 sec)
2.主库全量备份
mysqldump -uroot -p123456 -S /data/mysql56/mysql3308/mysql.sock -B -F -R -x --master-data= -A --events >/tmp/rep3308_$(date +%F).sql
3.从库导入全量备份
mysql -uroot -p123456 -S /data/mysql56/mysql3309/mysql.sock </tmp/rep3308_$(date +%F).sql
4.开启同步
查看 主master状态
change master to master_host='192.168.0.15',master_user='rep',master_password='rep123',master_port=,master_log_file='mysql-bin.000025',master_log_pos=;
start slave; show slave status\G
两个线程都是yes说明成功
5.读写分离
mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等
类似nginx负载平衡 zabbix-proxy功能差不多 都是转发请求
1.下载安装mysql-proxy
我们安装在另一台机器上内网ip:192.168.0.19
安装路径: /usr/local/
wget -c https://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
tar xf mysql-proxy-0.8.-linux-el6-x86-64bit.tar.gz
mv mysql-proxy-0.8.-linux-el6-x86-64bit /usr/local/mysql-proxy
cd /usr/local/mysql-proxy/
mkdir lua logs
cp share/doc/mysql-proxy/rw-splitting.lua ./lua #复制读写分离配置文件
cp share/doc/mysql-proxy/admin-sql.lua ./lua #复制管理脚本
2.配置文件
vi /etc/mysql-proxy.cnf
[mysql-proxy]
user=root #运行mysql-proxy用户
admin-username=mysqlproxy #主从mysql共有的用户
admin-password=mysqlproxy123 #用户的密码
proxy-address=192.168.0.19:4040 #mysql-proxy运行ip和端口,不加端口,默认4040
proxy-read-only-backend-addresses=192.168.0.11:3309 #指定后端从slave读取数据,不加端口默认3306
proxy-backend-addresses=192.168.0.11:3308 #指定后端主master写入数据,不加端口默认3306
proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua #指定读写分离配置文件位置
admin-lua-script=/usr/local/mysql-proxy/lua/admin-sql.lua #指定管理脚本
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log #日志位置
log-level=info #定义log日志级别,由高到低分别有(error|warning|info|message|debug)
daemon=true #以守护进程方式运行
keepalive=true #mysql-proxy崩溃时,尝试重启
配置文件授权
chmod /etc/mysql-proxy.cnf
3.创建代理数据库的用户(主从都要创建)
grant all on *.* to mysqlproxy@'192.168.0.%' identified by 'mysqlproxy123';
4.修改脚本部分配置
vim /usr/local/mysql-proxy/lua/rw-splitting.lua
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = , #默认超过4个连接数时,才开始读写分离,改为1
max_idle_connections = , #默认8,改为1
is_debug = false
}
end
5.启动
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
6.检查
# ss -tunlp|grep mysql-proxy
tcp LISTEN 192.168.0.19: *:* users:(("mysql-proxy",,))
7.测试
mysql -umysqlproxy -pmysqlproxy123 -h192.168.0. --port=
主库版本是5.6.28 从库是5.6.14
说明我连接上去查询语句是从从库返回的
关系型数据库MySQL主从同步-读写分离的更多相关文章
- 使用docker 实现MySQL主从同步/读写分离
1. 利用 docker 实现 mysql 主从同步 / 读写分离 为了保证数据的完整和安全,mysql 设计了主从同步,一个挂掉还可以用另个.最近重构论坛,想来改成主从吧.担心失误,就先拿 dock ...
- 聊聊Mysql主从同步读写分离配置实现
Hi,各位热爱技术的小伙伴您们好,好久没有写点东西了,今天写点关于mysql主从同步配置的操作日志同大家一起分享.最近自己在全新搭建一个mysql主从同步读写分离数据库简单集群,我讲实际操作步骤整理分 ...
- mysql 主从同步-读写分离
主从同步与读写分离测试 一. 实验环境(主从同步) Master centos 7.3 192.168.138.13 Slave ...
- mysql主从同步--读写分离。
1.mysql 安装参考 https://www.cnblogs.com/ttzzyy/p/9063737.html 2. 主mysql,从mysql 指定配置文件启动 mysqld --defaul ...
- mysql数据库主从同步读写分离(一)主从同步
1.mysql数据库主从同步读写分离 1.1.主要解决的生产问题 1.2.原理 a.为什么需要读写分离? 一台服务器满足不了访问需要.数据的访问基本都是2-8原则. b.怎么做? 不往从服务器去写了 ...
- Docker容器启动Mysql,Docker实现Mysql主从,读写分离
Docker容器启动Mysql,Docker实现Mysql主从,读写分离 一.Docker文件编排 二.配置主从复制 2.1 配置master 2.2 配置slave 三.验证主从复制 3.1 mas ...
- Mysql主从配置+读写分离
Mysql主从配置+读写分离 MySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具.因此,我们首先要在系统中源码编译安装cmake工具. ...
- Mysql主从配置+读写分离(转)
MySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具.因此,我们首先要在系统中源码编译安装cmake工具. 注:安装前须查看是否已经安装了 ...
- MySQL主从及读写分离配置
<<MySQL主从又叫做Replication.AB复制.简单讲就是A和B两台机器做主从后,在A上写数据,B也会跟着写数据,两者数据实时同步>> MySQL主从是基于binlo ...
随机推荐
- 深入理解BS结构应用程序
随着学习的深入,和编程经验的丰富,对BS应用程序有一些认识. 在一些讨论软件技术的QQ群里,或一些社区.BBS中,经常会有一些初学者会犯一些认知性的错误.比如经常会有一些朋友提这样的一些问题:“我怎么 ...
- python网络编程应用(一)
在之前的一篇博客<python网络编程基础>中介绍了socket.socket()函数及其应用,其实socket模块中还有很多属性可供网络应用程序使用.这里将详细讲解一下socket模块 ...
- log4j自动加载原理
java虚拟机加载log4j的类(LogManager.class)后,执行静态代码块,这个类中的静态代码块,会load log4j的配置文件,依次加载log4j.xml,log4j.properti ...
- laravel字段自增/自减
DB::table('users')->increment('votes');DB::table('users')->increment('votes', 5);DB::table('us ...
- Cocos2d-三维拾取Ray-AABB碰撞检测算法【转】
1.三维拾取技术 在3D游戏中通常会有这样的需求,用户可以选取3D世界中的某些物体进行如拖拽等操作,这时便需要程序通过将二维屏幕上的点坐标转换为三维世界中的坐标,并进行比对,这个过程就需要用到三维拾取 ...
- C# null,string.Empty,"",DBNull 的区别
[null] null 在C# 中是一个关键字,表示不引用任何对象的空引用的文字值. null 是引用类型变量的默认值. 普通值类型不能为 null. null 在 VS 中定位不出来具体是怎么定义的 ...
- js 利用数组实现类似于asp中的数据字典
---恢复内容开始--- 首先声明一个数组 var dictNew=new Array; var key; var value; for (var i = 0; i <50; i++) { // ...
- 《ASP.NET MVC 5 破境之道》:第一境 ASP.Net MVC5项目初探 — 第二节:MVC5项目结构
第一境 ASP.Net MVC5项目初探 — 第二节:MVC5项目结构 接下来,我们来看看,VS为我们自动创建的项目,是什么样子的? 可以通过菜单中[View]->[Solution Explo ...
- CRT和EXCRT简单学习笔记
中国剩余定理CRT 中国剩余定理是要求我们解决这样的一类问题: \[\begin{cases}x\equiv a_1\pmod {b_1} \\x\equiv a_2 \pmod{b_2}\\...\ ...
- 使用jquery怎么选择有两个class的元素?
实例: 我们想要选择class为:box_list clearfix 的div <div class="box_list clearfix" style="z-in ...