mysql集群

最近在参加项目开发微信小程序后台,由于用户数量巨大,且后台程序并不是很完美,所以对用户的体验很是不友好(简单说就是很卡)。赶巧最近正在翻阅《大型网站系统与Java中间件实践》。

所以,先是使用Docker swarm构建了负载均衡集群,然后使用Atlas做了数据库的读写分离,尽可能对用户进行分流,降低对单机服务器的负载,提高访问体验。本片随笔仅对数据库的读写分离部分进行介绍。

目标:实现mysql数据库集群,一个主节点负责写入数据,多个从节点负责读取数据

实验环境

服务器:

  1. 阿里云服务器:centos7(10.0.0.1)
  2. 腾讯云服务器:ubuntu:16.04(10.0.0.2)
  3. 京东云服务器:ubuntu:16.04 (10.0.0.3)

mysql:5.7

docker:18.03

实现方案

mysql 主从数据库 + Atlas读写分离

步骤:

进入Master服务器进行配置

  1. 使用Docker,在服务器上创建MySQL服务
docker run -p 3306:3306 --name mysql3306 -v /opt/mysql/data/data3306:/var/lib/mysql  -v /opt/mysql/logs/logs3306:/logs -e MYSQL_ROOT_PASSWORD=hello -d mysql:5.7
  1. 进Master服务器的MySQL数据库中,创建用户"niwoo"设置密码为"hello"
mysql -h 127.0.0.1 -uroot -phello

mysql> grant all on *.* to ninwoo@'127.0.0.1' identified by "hello";
Query OK, 0 rows affected, 1 warning (0.00 sec)
  1. 修改niwoo的访问权限
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Database changed
mysql> update user set host = '%' where user = 'ninwoo';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0
  1. 确认是否修改成功
mysql> update user set host = '%' where user = 'ninwoo';
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select user, host from user;
+---------------+-----------+
| user | host |
+---------------+-----------+
| ninwoo | % |
| root | % |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+
5 rows in set (0.00 sec)
  1. 更新数据库,是配置生效
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

Master,Slave1的MySQL数据库上创建CampusHire数据库

  1. 进入Slave1执行相同1,2,3,4操作

配置主从数据库连接

进入Master服务器进行配置

  1. 进入mysql容器内部,修改配置文件
docker exec -it mysql3306 bash
  1. 默认没有vim,无法修改文件
# 更新软件源
apt update
# 安装vim
apt install vim
  1. 修改mysql配置文件
vim /etc/mysql/mysql.conf.d/mysqld.cnf

添加如下配置

#主从复制配置
innodb_flush_log_at_trx_commit=1
sync_binlog=1
#需要备份的数据库
binlog-do-db=test
#不需要备份的数据库
binlog-ignore-db=mysql #启动二进制文件
log-bin=mysql-bin #服务器ID
server-id=1
  1. 退出容器,重启docker应用
docker restart mysql3306
  1. 进入数据库,配置主从复制的权限
mysql -h 127.0.0.1 -uroot -phello
mysql> grant replication slave on *.* to 'ninwoo'@'127.0.0.1' identified by 'hello';
Query OK, 0 rows affected, 1 warning (0.01 sec)
  1. 锁定数据库
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
  1. 查看主数据库信息,记住下面的“File”与“Position”的信息
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 439 | CampusHire | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
  1. 进入slave服务器,进入mysql容器内部
# 更新软件源
apt update
# 安装vim
apt install vim
  1. 修改从数据库的配置文件
vim /etc/mysql/mysql.conf.d/mysqld.cnf

添加server-id=2

  1. 重启Slave数据库
docker restart mysql3306
  1. 进入数据库,输入刚刚记录下来的File和Position
MySQL [(none)]> change master to master_host='10.0.0.1',
->
-> master_user='ninwoo',
-> master_password='hello',
-> master_port=3306,
-> master_log_file='mysql-bin.000001',
-> master_log_pos=439,
-> master_connect_retry=10;
  1. 启动Slave进程
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
  1. 查看复制状态
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 139.199.194.49
Master_User: ninwoo
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 439
Relay_Log_File: 2a8a4abdcf68-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: 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: 439
Relay_Log_Space: 534
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: 1
Master_UUID: 4a0187fa-b0a5-11e8-a7e7-0242ac110003
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more up dates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)

到这里主从数据的配置就已经完成,在向主库写入数据的同时,将在从库进行自动的备份。但在实际测试中遇到了配置完成之后无法向主数据库写入的问题,初步

判断是由于主库加锁而未解锁的问题,所以这里采用比较暴力的方法,重启主数据库容器。

# master节点
docker restart mysql3306

配置Atlas

Atlas是有360团队优化mysqlproxy而衍生出的版本,性能更好更稳定。

Atlas有两个版本,这里我选择普通版本,即不分表。

在阿里云主机(centos7)上进行一下安装步骤:

  1. 下载安装
[root@localhost ~]# cd /home/
[root@localhost home]# wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
  1. 安装
[root@localhost home]# rpm -ivh Atlas-2.2.1.el6.x86_64.rpm

安装目录位于/usr/local/mysql-proxy/

  1. 使用安装目录下的bin/encrypt程序加密数据库密码
[root@localhost bin]# ./encrypt hello
  1. 配置Atlas
[root@localhost conf]# cd /usr/local/mysql-proxy/conf/
[root@localhost conf]# vim test.cnf

修改以下配置:


#管理接口的用户名
admin-username = user #管理接口的密码
admin-password = pwd ... #Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 10.0.0.1:3306 #Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
proxy-read-only-backend-addresses = 10.0.0.2:3306@1 ... #用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
pwds = buck:RePBqJ+5gI4= ... #Atlas监听的工作接口IP和端口
proxy-address = 0.0.0.0:1234 #Atlas监听的管理接口IP和端口
admin-address = 0.0.0.0:2345

读者需要根据自己的实际情况修改以上配置

  1. 启动Atlas
[root@localhost bin]# /etc/init.d/mysqld status
OK: MySQL-Proxy of test is started
  1. 使用mysql命令连接数据库

其中2345端口是管理端口,用户可以在该管理数据库中修改数据库代理服务器的相关配置

[root@localhost bin]# mysql -h127.0.0.1 -P2345 -uuser -ppwd

其中1234端口是数据库代理服务器的端口,用户可以直接访问该端口进行数据库的访问和更新

[root@localhost bin]# mysql -h127.0.0.1 -P1234 -ubuck -phello
  1. 使用软件连接Atlas数据库代理服务器

这里发现,之前使用的mysql workbench无法正常使用,更换Navicat可以正常使用。

  1. 使用jdbc连接数据库

使用方法与普通数据库一样。

后记

到这里,配置就已经全部完成。有心的读者或者已经发现,还有一台服务器未使用,这台服务器将在以后接入到现有的mysql数据库集群当中,充当新的slave节点。该实验将在以后补上。

理论上说,我所做的这些或许会对负载过大的问题有所解决。但最近并未出现太高的访问现象,所以短期也没有看到效果。具体效果,将在实际场景中验证后补充上,敬请期待。

Mysql读写分离——主从数据库+Atlas的更多相关文章

  1. mysql读写分离 主从同步

    MySQL主从复制与读写分离的实现 转载 2013年01月17日 18:20:12   MySQL主从复制与读写分离 MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy) ...

  2. 使用Atlas实现MySQL读写分离+MySQL-(Master-Slave)配置

    参考博文: MySQL-(Master-Slave)配置  本人按照博友北在北方的配置已成功  我使用的是 mysql5.6.27版本. 使用Atlas实现MySQL读写分离 数据切分——Atlas读 ...

  3. Mysql读写分离与主从数据库设置方案

    Mysql读写分离与主从数据库设置方案 亿仁网 18-10-0711:31 Mysql无非四个功能:增,删,改,读.而将增删改和读分离操作.这样有利于提高系统性能.下面是非常直观的操作: 1.配置: ...

  4. [记录]MySQL读写分离(Atlas和MySQL-proxy)

    MySQL读写分离(Atlas和MySQL-proxy) 一.阿里云使用Atlas从外网访问MySQL(RDS) (同样的方式修改配置文件可以实现代理也可以实现读写分离,具体看使用场景) 1.在跳板机 ...

  5. yii2操作数据库 mysql 读写分离 主从复制

    转载地址:http://www.kuitao8.com/20150115/3471.shtml 开始使用数据库首先需要配置数据库连接组件,通过添加 db 组件到应用配置实现("基础的&quo ...

  6. 使用Amoeba实现mysql读写分离机制

    Amoeba的实用指南 http://docs.hexnova.com/amoeba/ 如何实现mysql读写分离 : 通常来说有两种方式: 1,应用程序层实现 2,中间件层实现 应用层实现 应用层实 ...

  7. mysql读写分离--一主多从,冗余存储

    转载了https://blog.csdn.net/u013421629/article/details/78793966 https://blog.csdn.net/justdb/article/de ...

  8. amoeba实现MySQL读写分离

    amoeba实现MySQL读写分离 准备环境:主机A和主机B作主从配置,IP地址为192.168.131.129和192.168.131.130,主机C作为中间件,也就是作为代理服务器,IP地址为19 ...

  9. amoeba安装与实现amoeba for mysql读写分离

    运行环境 l  CentOS6.3 l  Jdk1.6.0_30 l  amoeba-mysql-binary-2.2.0 l  amoeba:192.168.88.17 l  master1:192 ...

随机推荐

  1. 1031. [JSOI2007]字符加密【后缀数组】

    Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作 ...

  2. Day11 Java内部类

    什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public ...

  3. App性能测试-GT

    无意之间发现了GT(随身调)这个性能测试工具,该工具是由腾讯出品的开源测试工具,直接运行在手机上的“集成调测环境”. 1.下载:下载地址:开源地址:https://github.com/Tencent ...

  4. 关于Koala 中文编译出错

    关于koala: 我们知道koala是一个前端预处理器语言图形编译工具,支持Less.Sass.Compass.CoffeeScript,帮助web开发者更高效地使用它们进行开发.跨平台运行,完美兼容 ...

  5. python -- 解决UnicodeEncodeError问题

    使用中文字段时,经常会出现该异常:UnicodeEncodeError: 'ascii' codec can't encode characters in position 解决方法1: 在开头加上 ...

  6. json和jsonp的问题

    本文转载自:http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html 前言: 说到AJAX就会不可避免的面临 ...

  7. Linux Shell常用技巧(六)

    十二.   行的排序命令sort:   1.  sort命令行选项: 选项 描述 -t 字段之间的分隔符 -f 基于字符排序时忽略大小写 -k 定义排序的域字段,或者是基于域字段的部分数据进行排序 - ...

  8. Java序列化反序列化对象流ObjectInputStream、ObjectOutputStream

    使用Person类作为Object进行示范 注意:Object要能被写入流需要实现Serializable接口 存储的文件后缀名为.ser 示范Person类 import java.io.Seria ...

  9. springboot activiti 整合项目框架源码 shiro 安全框架 druid windows10风格

     官网:www.fhadmin.org  此项目为Springboot工作流版本 windows 风格,浏览器访问操作使用,非桌面应用程序. 1.代码生成器: [正反双向](单表.主表.明细表.树形表 ...

  10. spring cloud gateway之filter篇

    转载请标明出处: https://www.fangzhipeng.com 本文出自方志朋的博客 在上一篇文章详细的介绍了Gateway的Predict,Predict决定了请求由哪一个路由处理,在路由 ...