mysql读写分离 集群 - Go语言中文社区

mysql读写分离 集群


主:192.168.122.11
从:192.168.122.22
代理:192.168.122.33

主和从上分别
是远程连接,要授予远程连接的权限
mysql> create database db;
mysql> use db;
mysql> create table test(id int);
mysql> insert into test values(1),(2);
mysql> select * from test;

mysql> grant all on db_1.* to proxy@'%' identified by '123';

代理服务器上要测试
[root@node3 ~]# /usr/local/mysql/bin/mysql -h 192.168.122.11 -u proxy -p123
[root@node3 ~]# /usr/local/mysql/bin/mysql -h 192.168.122.22 -u proxy -p123

[root@node3 tmp]# tar xf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
[root@node3 tmp]# mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy
[root@node3 tmp]# cd /usr/local/mysql-proxy/share/doc/mysql-proxy/
[root@proxy mysql-proxy]# vim rw-splitting.lua 更改链接数,分离
[root@node3 mysql-proxy]# cd /usr/local/mysql-proxy/bin/
[root@localhost bin]# killall mysqld
[root@localhost bin]# killall mysqld
[root@node3 bin]# ./mysql-proxy -P 192.168.122.33:3306 -r 192.168.122.22:3306 -b 192.168.122.11:3306 -s /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua --daemon --user=nobody --log-level=debug --log-use-syslog

[root@node3 mysql-proxy]# cd /usr/local/mysql-proxy/bin/
[root@node3 bin]# ./mysql-proxy --help
[root@node3 bin]# ./mysql-proxy --proxy-address=192.168.122.33:3306 --proxy-read-only-backend-addresses=192.168.122.22:3306 --proxy-backend-addresses=192.168.122.11:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua --daemon --user=nobody --log-level=debug --log-use-syslog

==========================================================================================================================================

使用代理软件
mysql-proxy实现mysql的读写分离
实验:
192.168.1.14
客户端请求mysql-proxy,判断是写还是读
建立两次连接
是远程连接,要授予远程连接的权限

use db;
create table test (id int);
insert into test values (10),(100);
grant all on db.* to proxy@'%' identified by '123';

192.168.1.140
在打开一个终端设置从服务器
和主服务器一样,只是值不一样
mysql

create database dn;
use db
create table test (id int);
insert into test values (10),(200);
grant all on db.* to proxy@'%' identified by '123'; 密码和主服务器必须一样

指定一个代理服务器;192.168.1.15
测试
mysql -h 192.168.1.140 -u proxy -p123
mysql -h 192.168.1.14 -u proxy -p123
使用lva的脚本语言,把lva的解释起和lvadevell装上,day4里面有mysql-proxy
把两个包装上 rpm
mysql-proxy-0.8.0.........
rpm -ivh lua-5.0.2-1.el5.rf.i386.rpm
rpm -ivh lua-devel-5.0.2-1.el5.rf.i386.rpm
tar zxvf mysql-proxy-0.8.0-linux-rhel5-x86-32bit.tar.gz -C /usr/local/src

cp -r mysql-proxy-0.8.0-linux-rhel5-x86-32bit /usr/local/mysql-proxy

cd /usr/local/mysql-proxy/share/doc/mysql-proxy
vim rw-splitting.lua
36 if not proxy.global.config.rwsplit then
37 proxy.global.config.rwsplit = {
38 min_idle_connections = 1, 最小空闲线程连接
39 max_idle_connections = 1, 最大线程连接,基本没用

mysqlproxy的启动方法
cd bin
./mysql-proxy --help-proxy 查看帮助
mysql-proxy --proxy-read-only-backend-addresses=192.168.0.5:3306 --proxy-backend-addresses=192.168.0.3:3306 --proxy-lua-script=/usr/share/doc/mysql-prox[root@node3 bin]# ./mysql-proxy --proxy-address=192.168.122.33:3306 --proxy-read-only-backend-addresses=192.168.122.22:3306 --proxy-backend-addresses=192.168.122.11:3306 --proxy-lua-script=/usr/share/doc/mysql-proxy/rw-splitting.lua --daemon --user=nobody --log-level=debug --log-use-syslog
y/rw-splitting.lua --daemon --user=nobody --log-level=debug --log-use-syslog
-P 决定mysql用那个接口进行连接,指定mysql-proxy工作的时候允许访问的IP和接口 模拟成mysql,端口用3306,要保证自己本地的mysql不要运行,打开后端口冲突,mysql-proxy运行不起来
-r 只读的后端服务器 192.168.1.140
-b 读写的后端服务器 192.168.1.14
-s 工作的时候指定脚本的位置和名称,默认是没有的
版本小于5.1.12,会出现bug,要加上-bug
--deamon 以一个服务的形式去启动
什么算服务:被定义为服务的进程是没有终端的,不依赖于用户的终端。终端关掉,服务还是可以正常运行的

运行mysql-proxy
./mysql-proxy -P 192.168.1.15:3306 -b 192.168.1.14:3306 -r 192.168.1.140:3306 -s /usr/local/mysqlproxy/shaer/doc/mysql-proxy/rw-splitting.lua --daemon &

改变:#ulimit -n 10240 临时改变,永久改变,要改PAM
(ulimit -n 1
cat /etc/passwd /etc/shadow
会出错)

测试:
模拟客户端,利用mysql命令往mysql-proxy发起连接
mysql -h 192.168.1.15 -u proxy -p123

use db;
select * from test;

另一个标签
mysql -h 192.168.1.15 -u proxy -p123

use db;
select * from test;

可以增大连接数目

update test set id=300; 改变数据

然后可以把140 14 搭建成主从的模式

错误
1.iptables 防火墙 selinux
2.启动脚本 参数错误
3.用户错误
4.proxy启动mysql服务


mysql-cluster

1、准备5台服务器,为五台机器分别安装Linux操作系统(RHEL 6.5 x86_64bit),并分配IP地址

Management Node 1.1.1.6 (负责管理整个集群)
SQL Node 1.1.1.7 (负责操作数据库)
SQL Node 1.1.1.8 (负责操作数据库)
Data Node 1.1.1.9 (负责存储数据)
Data Node 1.1.1.10 (负责存储数据)

(SQL节点和数据节点可以同在一台机器上)

2、修改5台服务器的/etc/hosts文件,修改完后的内容如下:

1.1.1.6 node1.manager.com
1.1.1.7 node2.sql1.com
1.1.1.8 node3.sql2.com
1.1.1.9 node4.data1.com
1.1.1.10 node5.data2.com

3.分别在5台服务器上解压 mysql-cluster-gpl-7.3.7-linux-glibc2.5-x86_64.tar.gz

[root@node5 ~]# cd /tmp
[root@node5 tmp]# tar xf mysql-cluster-gpl-7.3.7-linux-glibc2.5-x86_64.tar.gz
[root@node5 tmp]# mv mysql-cluster-gpl-7.3.7-linux-glibc2.5-x86_64 /usr/local/mysql-cluster
[root@node5 tmp]# chown -R mysql.mysql /usr/local/mysql-cluster

注意:管理节点只需要建立/usr/local/mysql-cluster/目录
将ndb_mgm ndb_mgmd两个可执行程序拷贝到/usr/local/mysql-cluster/下(从任意节点拷贝)

4.管理节点的配置
vim /usr/local/mysql-cluster/config.ini
[ndbd default]
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M

[ndb_mgmd]
hostname=1.1.1.6
datadir=/usr/local/mysql-cluster

[ndbd]
hostname=1.1.1.9
datadir=/usr/local/mysql-cluster/data

[ndbd]
hostname=1.1.1.10
datadir=/usr/local/mysql-cluster/data

[mysqld]
hostname=1.1.1.7

[mysqld]
hostname=1.1.1.8

启动管理节点
/usr/local/mysql-cluster/bin/ndb_mgmd -f /usr/local/mysql-cluster/config.ini --initial
(第一次启动时这样执行,如果后面新添加了数据节点。执行此命令时,需要带上--initital参数,否则新添加的节点,无法被识别)

[root@node5 mysql-cluster]# ./ndb_mgm (查看启动后的集群状态,看看集群是否成功启动,如果看到以下内容,表示集群已经成功配置并启动)
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration


[ndbd(NDB)] 2 node(s)
id=2 @1.1.1.9 (mysql-5.6.21 ndb-7.3.7, Nodegroup: 0, *)
id=3 @1.1.1.10 (mysql-5.6.21 ndb-7.3.7, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1 @1.1.1.6 (mysql-5.6.21 ndb-7.3.7)

[mysqld(API)] 2 node(s)
id=4 @1.1.1.7 (mysql-5.6.21 ndb-7.3.7)
id=5 @1.1.1.8 (mysql-5.6.21 ndb-7.3.7)

5.数据节点(注意实验环境内存尽量设置大于1G)
[root@node3 mysql-cluster]# vim /etc/my.cnf
[mysqld]
ndbcluster

[mysql_cluster]
ndb-connectstring=1.1.1.6

启动
/usr/local/mysql-cluster/bin/ndbd

6.SQL节点
vim /etc/my.cnf
[mysqld]
ndbcluster

[mysql_cluster]
ndb-connectstring=1.1.1.6

初始化(只SQL需要做)
cd /usr/local/mysql-cluster/
./scripts/mysql_install_db --user=mysql

启动sql节点(杀死其他mysql进程)
./bin/mysqld_safe --user=mysql &

测试
1.测试数据同步读取
create database king;
create table test(id int) engine=ndbcluster;
insert into test values(1);
select * from test;

2.测试数据节点失败

3.测试SQL节点失败


MySQL 5.1 AB 复制

ab复制(主从复制)
可以让mysql实现:
1.数据的备份(主服务器的数据全部同步到从服务器)
2.可以负载均衡减小主服务器的压力
3.真正实现mysql的读写分离

配置方法
主服务器:
1.cat /etc/my.cnf
[mysqld]
log-bin=mysql_bin
server-id=1 不允许重复
2.grant replication slave on . to ‘slave‘@‘192.168.1.140‘ identified by '123';授权,指定从服务器只能复制binlog,从服务器的ip
mysql>show master status查看主服务器的运行状态

在从上使用slave用户登录测试:
3.mysql -u slave -p123 -h 192.168.1.14
4.mysqldump --all-database > db_backup.sql (主服务执行全备)
5.mysql> show master status;找到当前的日志文件和位置号

从:(可以不用开启binlog功能)
6.mysql -uroot -p123 < db_backup.sql 将主服务的全备脚本拷贝到主服务器并且导入主服务器
7.cat /etc/my.cnf
[mysqld]
server-id=2 和主服务器不重复就可以
master-host=192.168.1.131 主服务器ip
master-user=slave 登录时账号
master-password=123 mysql读取配置文件时,知道是以从服务器的形式运行

8.从服务器从主服务器读取binlog产生问题时
mysql -u root -p
mysql> change master to
mysql> master_host='192.168.1.131',
mysql> master_user='slave',
mysql> master_password='123',
mysql> master_log_file='',
mysql> master_log_pos=399;

9.启动从服务器
mysql> slave start 或者是start slave,启动从服务器
mysql>show slave status 查看从服务器状态

练习:
主----从(主)------从
log-slave-updates 中间这台作用:中继日志内容写入到binlog日志

互主
[mysqld]
log-bin=mysql_bin
server-id=1
master-host=192.168.100.130
master-user=slave2
master-password=123
auto-increment-increment=2
auto-increment-offset=1

[mysqld]
log-bin=slave
server-id=2
master-host=192.168.100.128
master-user=slave
master-password=123
auto-increment-increment=2
auto-increment-offset=2

主服务器
A ip 172.16.10.1
1.A全备份
mysqldump -u root -S /var/lib/mysql/mysql.sock --all-databases >> /tmp/all.sql
2.开启binlog日志
vim /etc/my.cnf
[mysqld]
log-bin=master
log-bin-index=master
server-id=1

service mysqld restart

3.授权B服务器 可以传输binlog日志
grant replication slave on . to slave@'172.16.10.2' identified by '123';

从服务器
B ip 172.16.10.2
1.测试slave是否能正常链接
mysql -u slave -p123 -h 172.16.10.1

2.拷贝A服务器的全备,并且恢复
scp 172.16.10.1:/backup/all.sql ./
mysql -u root < /root/all.sql

3.配置A服务器连接地址及用户信息
vim /etc/my.cnf
[mysqld]
server-id=2
master-user=slave
master-password=123
master-host=172.16.10.1

测试
A服务器
mysql> show master statusG

B服务器
mysql> show slave statusG
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

A服务器做出数据改动 查看从服务器是否有同步的变化


版权声明:本文来源简书,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.jianshu.com/p/658a13992164
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-01-12 13:22:30
  • 阅读 ( 1330 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢