一、本次环境架构图

  由于公司内网服务器有限,所以后端采用Mariadb自带的mysql_multi模型实现多实例。

mysql的多实例有两种方式可以实现,两种方式各有利弊。

  1、使用多个配置文件启动不同的进程来实现多实例,这种方式的优势逻辑简单,配置简单,缺点是管理起来不太方便。

  2、通过官方自带的mysqld_multi使用单独的配置文件来实现多实例,这种方式定制每个实例的配置不太方便,优点是管理起来很方便,集中管理。

二、mariadb多实例实现:

mariadb配置文件如下(红色部分为修改内容):

注意使用了mysqld_multi,就不能在启用mysqld模块,红色部分为修改或者添加内容

[client]
port =
socket = /tmp/mysql.sock
#default-character-set=utf8 [mysqld_multi] # 启用 mysqld_multi 多实例模式
mysqld = /usr/local/mysql/bin/mysqld_safe # 指定两个管理命令
mysqladmin = /usr/local/mysql/bin/mysqladmin [mysqld1] # 定义mysql1实例
port =
socket = /tmp/mysql3306.sock
basedir = /usr/local/mysql
datadir = /mysqldata/data3306
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache =
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size =
query_cache_size = 32M
thread_concurrency =
log-bin=mysql-bin-1
server-id = 1 # 标记server-id 不能重复
log-bin=mysql-bin3306 # 用于同步数据的日志文件
binlog_ignore_db = mysql # 忽视mysql库的同步
log_slave_updates # 从库binlog记录主库同步的操作日志
slave_skip_errors = all # 跳过从库出错的SQL
auto_increment_increment = 2 # 主主同步时,每次递增量
auto_increment_offset = 1 # 主主同步,从自增开始,从那个数开始自增 [mysqld2]
port =
socket = /tmp/mysql3307.sock
basedir = /usr/local/mysql
datadir = /mysqldata/data3307
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
thread_concurrency = 8
log-bin=mysql-bin-2
server-id = 2
log_bin=mysql-bin3307
log_slave_updates
auto_increment_increment =
auto_increment_offset = 2 [mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
default-character-set = utf8
[myisamchk]
key_buffer_size = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout

初始化数据库:

[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mysqldata/data3306/
[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mysqldata/data3307/

启动库:
# 这里有很多种启动方式 mysqld_multi start 1, mysqld_multi start 2
# 注意这里是启动实例,则不需要启动mysqld

[root@localhost mysql]# mysqld_multi start -
[root@localhost mysql]# ss -ntpl | grep mysqld
LISTEN *: *:* users:(("mysqld",pid=,fd=))
LISTEN *: *:* users:(("mysqld",pid=,fd=))

连接实例库:

连接3306

[root@localhost ~]# mysql -uroot -S /tmp/mysql3306.sock

连接3307

[root@localhost ~]# mysql -uroot -S /tmp/mysql3307.sock

三、实现mariadb 主主同步

1. 在两个实例中分别创建用于同步的用户。注:用于同步的用户必须具备: replication slave, reload, super 权限

3306库:

MariaDB [(none)]> GRANT REPLICATION SLAVE, RELOAD, SUPER ON *.* TO 'backup'@'192.168.118.187' identified by '';

3307库:

MariaDB [(none)]> GRANT REPLICATION SLAVE, RELOAD, SUPER ON *.* TO 'backup'@'192.168.118.187' identified by '';

2. 分别查看两个实例的master log 和 Position

3306库:

MariaDB [(none)]> show master status\G
*************************** . row ***************************
File: mysql-bin3306.
Position:
Binlog_Do_DB:
Binlog_Ignore_DB: mysql

3307库:

MariaDB [(none)]> show master status\G
*************************** . row ***************************
File: mysql-bin3307.
Position:
Binlog_Do_DB:
Binlog_Ignore_DB:

3. 分别为两个实例配置master 互为主备

3306实例配置:

# 这里的master为在实例3307上配置的用户信息,master_log_file 为3307的master file master_log_pos 为 3307的Position

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.118.187', MASTER_PORT=, MASTER_USER='backup', MASTER_PASSWORD='', MASTER_LOG_FILE='mysql-bin3307.000001', MASTER_LOG_POS=;

3307实例配置:

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.118.187', MASTER_PORT=, MASTER_USER='backup', MASTER_PASSWORD='', MASTER_LOG_FILE='mysql-bin3306.000001', MASTER_LOG_POS=;
MariaDB [(none)]> show slave status\G     # 查看是否配置成功

*************************** . row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.118.187
Master_User: backup
Master_Port:
Connect_Retry:
Master_Log_File: mysql-bin3307.
Read_Master_Log_Pos:
Relay_Log_File: localhost-relay-bin.
Relay_Log_Pos:
Relay_Master_Log_File: mysql-bin3307.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...

这里最主要的两个参数:Slave_IO_Running: Yes、 Slave_SQL_Running: Yes  如果这里都是Yes表示配置成功。配置master时,注意思路要清晰,端口不能错。

4. 测试:

MariaDB [(none)]> CREATE DATABASE hello_db;
Query OK, row affected (0.00 sec) MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hello_db |
| mysql |
| performance_schema |
| test |
+--------------------+
rows in set (0.00 sec) 3307库查看是否同步: MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hello_db |
| mysql |
| performance_schema |
| test |
+--------------------+

3307 删除hello_db:

MariaDB [(none)]> DROP DATABASE hello_db;
Query OK, rows affected (0.00 sec) MariaDB [(none)]> FLUSH PRIVILEGES; 查看是否同步删除: MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+

通过以上测试,Mariadb主主配置成功。

四、配置HAProxy实现后端mariadb负载均衡

[root@localhost ~]# yum install haproxy -y 

HAProxy 配置文件:

global
log 127.0.0.1 local2 chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn
user haproxy
group haproxy
daemon stats socket /var/lib/haproxy/stats defaults
mode http
log global
option tcplog
option dontlognull
#option http-server-close
#option forwardfor except 127.0.0.0/
option redispatch
retries
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn listen proxy-sql 192.168.118.187: # 创建proxy-sql
mode tcp
balance roundrobin # 算法为轮询
option mysql-check user haproxy # 在mysql中创建无任何权限用户haproxy,且无密码用于监控
server mysql3306 192.168.118.187: check maxconn weight # 后端主机
server mysql3307 192.168.118.187: check maxconn weight [root@localhost haproxy]# ss -tnlp | grep haproxy
LISTEN 192.168.118.187: *:* users:(("haproxy",pid=,fd=))

2. 创建用于监控的mariadb 用户 haproxy

# 两个实例都需要创建,创建一个后,可以直接查看第二个实例是否也同步了。

MariaDB [(none)]> CREATE USER 'haproxy'@'%' ;

3. 通过haproxy端口连接数据库

  HAProxy工作原理:当HAProxy接收到用户请求后,不是直接透明转发客户端请求到后端服务器,而是HAProxy到后端服务器取数据。
  由此可见,当客户端发情mariadb连接请求后,由HAProxy来建立连接mariadb。因此,HAProxy客户端地址为HAProxy服务器地址而不是客户端地址。

  PS: 因为这里HAProxy是对外服务,所以监听的地址是:192.168.118.187 而不是本地回环地址,因此需要对IP地址为192.168.118.187赋予权限。

  这里就牵扯到mariadb权限的问题,给与haproxy地址访问权限:

MariaDB [(none)]> GRANT ALL ON *.* TO 'root'@'192.168.118.187' IDENTIFIED BY '';

  以上操作必须要保证两个实例都要具备:

MariaDB [(none)]> SELECT HOST, USER, PASSWORD FROM mysql.user WHERE HOST='192.168.118.187';
+-----------------+--------+-------------------------------------------+
| HOST | USER | PASSWORD |
+-----------------+--------+-------------------------------------------+
| 192.168.118.187 | backup | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 192.168.118.187 | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------------+--------+-------------------------------------------+

启动服务

[root@localhost ~]# systemctl start haproxy     # 启动HAProxy服务

4. 本地测试:

[root@localhost ~]# mysql -uroot -p123456 -P  -h 192.168.118.187
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is
Server version: 5.5.-MariaDB MariaDB Server Copyright (c) , , Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>

本次测试成功。

再次使用Navicat连接:

这样通过HAProxy代理到后端mariadb负载成功。

五、总结:

1. 这样的架构最好只是在测试环境使用,因为影响到的因素会很多。比如磁盘IO问题:用户请求响应的IO,实例同步的IO。
    生产环境建议如下架构:

[ Mariadb ] 通过HAProxy代理后端Mariadb实现负载均衡的更多相关文章

  1. haproxy+keepalived实现高可用负载均衡

    软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载. HA ...

  2. haproxy+keepalived实现高可用负载均衡(转)

      软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载. ...

  3. HAProxy & Keepalived L4-L7 高可用负载均衡解决方案

    目录 文章目录 目录 HAProxy 负载均衡器 应用特性 性能优势 会话保持 健康检查 配置文件 负载均衡策略 ACL 规则 Web 监控平台 Keepalived 虚拟路由器 核心组件 VRRP ...

  4. HAProxy实现动静分离和负载均衡

    由于电脑配置渣,带不动多台虚拟机,所以采用httpd虚拟主机的方式来实现 1 2 3 CentOS 6.7 httpd: 2.2.15 HAProxy: 1.5.4 主机规划 1 2 3 4 5 - ...

  5. Nginx代理tcp端口实现负载均衡

    Nginx代理tcp端口实现负载均衡 1.修改配置文件 vi /etc/nginx/nginx.conf 添加如下配置: stream { ###XXX upstream notify {   has ...

  6. Azure Application Gateway(二)对后端 VM 进行负载均衡

    一,引言 上一节有讲到使用 Azure Application Gateway 为我们后端类型为 Web App 的 Demo 项目提供负载均衡,Azure Application Gateway 的 ...

  7. Azure Front Door(二)对后端 VM 进行负载均衡

    一,引言 上一篇我们讲到通过 Azure Front Door 为我们的 Azure App Service 提供流量转发,而整个 Azure Front Door 在添加后端池的时候可选的后端类型是 ...

  8. 负载均衡服务之HAProxy https配置、四层负载均衡以及访问控制

    前文我们聊了下haproxy的访问控制ACL的配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12817773.html:今天我们来聊一聊haproxy的h ...

  9. 003.HAProxy ACL规则的智能负载均衡

    一 简介 HAProxy可以工作在第七层模型,可通过ACL规则实现基于HAProxy的智能负载均衡系统,HAProxy通过ACL规则完成以下两种主要功能: 通过ACL规则检查客户端请求是否合法,如果符 ...

随机推荐

  1. MVC项目用Windsor注入

    第一步创建controler 注入类 public class ApiControllersInstaller : IWindsorInstaller {  public void Install(I ...

  2. Android之内容提供者ContentProvider的总结

    本文包含以下知识点: ContentProvider Uri 的介绍 ContentResolver: 监听ContentProvider的数据改变 一:ContentProvider部分 Conte ...

  3. 官方文档 恢复备份指南八 RMAN Backup Concepts

    本章内容 Consistent and Inconsistent RMAN Backups Online Backups and Backup Mode Backup Sets Image Copie ...

  4. JavaSE复习(四)File类与IO流

    File类 构造方法 public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例. public File(String parent ...

  5. MySQL初识3

    随着对MySQL的熟识,今次总结一下MySQL数据库的删除.备份和还原操作 1.数据库的删除: a.删除数据库的命令:drop database dbname; b.删除数据库中的表: 单个表:dro ...

  6. 软工实践Beta冲刺(2/7)

    队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...

  7. 3GPP规范命名规则解读

    http://blog.sina.com.cn/s/blog_6b10255301012co6.html 学习了解电信技术知识的一个很好的手段是阅读3GPP的规范.但是3GPP有大量的规范,我们可能经 ...

  8. qemu的device参数解释 包括socket的一些知识

    前面一片是driver,是把这个新的设备“插入到虚机中”,device 是准备驱动了.device 都是和设备配合使用的.要怎么去驱动一个设备,包括使用的驱动函数是啥,device后面的函数根据驱动的 ...

  9. 【转】64位ORACLE客户端上plsql无法识别ORACLE_HOME解决方案

    转自:http://www.2cto.com/database/201503/386267.html 中文显示问号 转自:http://zhidao.baidu.com/link?url=qJDmsa ...

  10. 关于JS中array对象的push( )

    push()的参数传的是指针,不是值. var arr = new Array(); var item = 5; arr.push(item); var item = 6; 运行以上代码,arr中的元 ...