一、本次环境架构图

  由于公司内网服务器有限,所以后端采用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. [leetcode-634-Find the Derangement of An Array]

    In combinatorial mathematics, a derangement is a permutation of the elements of a set, such that no ...

  2. [译]如何根据条件从pandas DataFrame中删除不需要的行?

    问题来源:https://stackoverflow.com/questions/13851535/how-to-delete-rows-from-a-pandas-dataframe-based-o ...

  3. Hadoop2.6.0 完全分布式搭建

    1 搭建这个完全分布式的前提环境: 配置好了jdk环境 配置好了ssh免密码登录(详见我的另外一篇博客,专门说ssh免密码登录) 我这里设置了四台机器,一台做master,另外三台做slave,hos ...

  4. maven中进行go的编译

    maven提供的插件maven-antrun-plugin真是个好东东,使得maven可以利用ant的很多功能. 最近需要实现在maven中实现对go代码的编译,添加如下代码在pom文件中即可. &l ...

  5. javaScript运算符学习笔记

    1.赋值运算符 javaScript运算符可以分为简单赋值和复合赋值运算.简单赋值运算是将赋值运算符(=)右边的表达式的值保存到赋值运算符左边的变量中,复合赋值运算则是混合了其他操作(算术运算操作,位 ...

  6. 左右躲避障碍-神手ts版本

    TypeScript-左右躲避障碍-神手 学习typescript,第一步应该是学习官方文档,理解最基础的语法.第二步开始用typescript实现一些js+css 或者canvas类型的游行.现在开 ...

  7. AGC016B Colorful Hats(构造)

    题目大意: 给定n和n个数,每个数a[i]代表除了i外序列中颜色不同的数的个数,问能否构造出来这个数列. 比较简单,首先先求出来a数列的最大值Max, 如果有数小于Max-1,那么显然是不存在的 接下 ...

  8. 洛谷 P1251 餐巾计划问题

    题目链接 最小费用最大流. 每天拆成两个点,早上和晚上: 晚上可以获得\(r_i\)条脏毛巾,从源点连一条容量为\(r_i\),费用为0的边. 早上要供应\(r_i\)条毛巾,连向汇点一条容量为\(r ...

  9. [Leetcode] search a 2d matrix 搜索二维矩阵

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  10. npm错误总结

    You cannot publish over the previously published version 1.0.1." : xxx 发布时一定要修改package.json的版本号 ...