mysql主主+keepalived 我这里使用的是mariadb
granfana两台+keepalived
Mysql01 – 192.168.137.100
Mysql02 – 192.168.137.101
Grafana01 – 192.168.137.103
Grafana02 – 192.168.137.104
1, 安装mariadb-server 01,02都安装
yum install -y mariadb-server
启动mariadb
systemctl enable mariadb.service --now
Mariadb初始化
mysql_secure_installation
Enter current password for root (enter for none): 当前数据库管理员的密码,无密码直接回车
Set root password? [Y/n] Y 设定数据库管理员密码
New password:
Re-enter new password:
Password updated successfully!
... Success!
Remove anonymous users? [Y/n] y
... Success! 移除匿名用户登陆
Disallow root login remotely? [Y/n] y
... Success! 移除管理员远程登陆
Remove test database and access to it? [Y/n] Y
... Success! 移除测试库
Reload privilege tables now? [Y/n] y
... Success! 刷新数据库
测试一下mysql 密码我设置成了wsn123
mysql -u root -pwsn123
创建grafana数据库和用户for权限
create database grafana;
create user grafana@'%' IDENTIFIED by 'wsn456';
grant all privileges on grafana.* to grafana@'%';
flush privileges;
Mysql02 也执行以上命令
2, 配置mariadb主主结构
首先配置mysql01
vim /etc/my.cnf
#[mysqld_safe]注释掉
#log-error=/var/log/mariadb/mariadb.log
#pid-file=/var/run/mariadb/mariadb.pid
# 配置server-id 每个MySQL实例的server-id都不能相同
server-id=1
# # MySQL的日志文件的名字
log-bin=mysql_master
# # 作为从库时 更新操作是否写入日志 on:写入 其他数据库以此数据库做主库时才能进行同步
log-slave-updates=on
#
# # MySQL系统库的数据不需要同步 我们这里写了3个 更加保险
# # 同步数据时忽略一下数据库 但是必须在使用use db的情况下才会忽略;如果没有使用use db 比如create user 数据还是会同步的
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
replicate-ignore-db=performance_schema
replicate-ignore-db=sys
# # 使用通配符忽略MySQL系统库的表 这样在create user时也不会进行同步了
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=performance_schema.%
replicate_wild_ignore_table=sys.%
# # MySQL系统库的日志不计入binlog 这样更加保险了
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
Mysql02修改my.cnf文件我直接复制过去,只需要修改其中的两个地方,如下:
# 配置server-id=2
server-id=2
# MySQL的日志文件的名字 不改名字也可以 这里主要为了区分
log-bin=mysql_slave
重启mariadb.service
systemctl restart mariadb.service
下面我们就要配置主从了,其实主主模式就是配置两个主从,先配置mysql01 -> mysql02 的主从,然后再反过来配置mysql02 -> mysql01的主从,这样主主的模式就配置好了。
先登录mysql01 的数据库,并执行如下命令:
# 创建备份的账号 使用MYSQL_NATIVE_PASSWORD的方式加密
mysql> create user wsndb@'%' IDENTIFIED by 'wsn456';
对wsndb授予备份的权限
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘wsndb’@’%’;
# 刷新权限
mysql> FLUSH PRIVILEGES;
# 查看MySQL主节点的状态
MariaDB [(none)]> show master status;
+---------------------+----------+--------------+-------------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+----------+--------------+-------------------------------------------------+
| mysql_master.000001 | 245 | | information_schema,mysql,performance_schema,sys |
+---------------------+----------+--------------+-------------------------------------------------+
1 row in set (0.00 sec)
我们要记住binlog文件的名字,也就是mysql_master.000001,和位置,也就是245
然后,我们再登录到mysql02 的数据库,执行如下命令:
mysql> CHANGE MASTER TO
# MySQL主的IP
-> MASTER_HOST='192.168.137.100',
# MySQL主的端口
-> MASTER_PORT=3306
# MySQL主的备份账号
-> MASTER_USER='wsndb',
# MySQL主的备份账号密码
-> MASTER_PASSWORD='wsn456',
# 日志文件 通过show master status得到的
-> MASTER_LOG_FILE='mysql_master.000001',
# 日志文件位置 通过show master status得到的
-> MASTER_LOG_POS=245;
# 开启从库
mysql> START SLAVE;
# 查看从库的状态
mysql> SHOW SLAVE STATUS;
这样,mysql01(主1)->mysql02(主2)的主从就搭建好了,然后,我们再反过来,搭建mysql02(主2)->mysql01(主1)的主从。
先登录mysql02(主2)的数据库,执行如下命令:
# 创建备份的账号 使用MYSQL_NATIVE_PASSWORD的方式加密
mysql> create user wsndb2@'%' IDENTIFIED by 'wsn456';
# 对wsndb2授予备份的权限
mysql> GRANT REPLICATION SLAVE ON *.* TO 'wsndb2'@'%';
# 刷新权限
mysql> FLUSH PRIVILEGES;
查看MySQL主节点的状态
MariaDB [(none)]> show master status;
+--------------------+----------+--------------+-------------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+-------------------------------------------------+
| mysql_slave.000001 | 545 | | information_schema,mysql,performance_schema,sys |
+--------------------+----------+--------------+-------------------------------------------------+
1 row in set (0.00 sec)
再登录到mysql01(主1)的数据库,执行如下命令:
CHANGE MASTER TO
MASTER_HOST=’192.168.137.101′,
MASTER_PORT=3306,
MASTER_USER=’wsndb2′,
MASTER_PASSWORD=’wsn456′,
MASTER_LOG_FILE=’mysql_slave.000001′,
MASTER_LOG_POS=545;
# 开启从库
mysql> START SLAVE;
# 查看从库的状态
mysql> SHOW SLAVE STATUS;
这样,mysql02(主2)->mysql01(主1)的主从也搭建好了。我们可以使用navicat分别连接mysql01(主1)和mysql02(主2),并执行建表、插入语句,验证一下主主同步是否成功,这里就不给大家演示了。
Keepalived高可用
MySQL主主结构已经搭建好了,无论从哪个MySQL插入数据,都会同步到另外一个MySQL。虽然有了MySQL主主结构,但是不能保证高可用,比如,我们的应用程序连接的是192.168.137.100(主1),倘若192.168.137.100(主1)的MySQL挂掉了,我们的应用程序并不能自动的切换到192.168.137.101(主2),我们的应用程序也是不可用的状态。要做到这一点,就要借助于Keepalived。
Keepalived有两个主要的功能:
—–提供虚IP,实现双机热备
—–通过LVS,实现负载均衡
我们这里使用Keepalived,只需要使用其中的一个功能,提供虚IP,实现双机热备。我们需要在192.168.137.100(主1)和192.168.137.101(主2)上都安装Keepalived,执行命令如下:
yum install keepalived
我们直接使用yum进行安装。安装完之后,编辑keepalived的配置文件,首先编辑mysql01的
vim /etc/keepalived/keepalived.conf
# 全局配置 不用动 只需注释掉vrrp_strict
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#必须注释掉 否则报错
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# 检查mysql服务是否存活的脚本
vrrp_script chk_mysql {
script "/opt/chk_mysqld.sh"
}
# vrrp配置虚IP
vrrp_instance VI_1 {
# 状态:MASTER 另外一台机器为BACKUP
state MASTER
# 绑定的网卡
interface ens33
# 虚拟路由id 两台机器需保持一致
virtual_router_id 51
# 优先级 MASTER的值要大于BACKUP
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP地址 两台keepalived需要一致
virtual_ipaddress {
192.168.137.150
}
# 检查脚本 vrrp_script的名字
track_script {
chk_mysql
}
}
###后边的virtual_server全部注释掉 它是和LVS做负载均衡用的 这里用不到 ###
再编辑mysql02(主2)上的配置文件,只需要将state MASTER改为state BACKUP,如下:
state BACKUP
通过keepalived的配置,我们对外提供192.168.137.150的IP,这个IP实际指向是192.168.137.100(主1),因为它的state是MASTER。当keepalived检测到192.168.137.100(主1)上的MySQL不可用时,会自动切换到192.168.137.101(主2)。对于外部用户是无感知的,因为外部统一使用的是192.168.137.150。
启动keepalived
systemctl enable keepalived --now
我们通过MySQL主主结构+keepalived双机热备实现了MySQL的高可用,我们应用程序可以连接虚IP,具体连接的实际MySQL,不需要我们关心。如果我们再做读写分离的话,可以将MySQL(主2)作为主,配置数据库的主从关系。这时,虚IP连接的是MySQL(主1),MySQL(主1)将数据同步到MySQL(主2),然后MySQL(主2)再将数据同步到其他从库。如果MySQL(主1)挂掉,虚IP指向MySQL(主2),MySQL(主2)再将数据同步到其他从库。
Grafana HA高可用部署
首先上面mariadb 我已经创建好了 grafana的数据库我们一会将会利用到
安装 grafana 安装包在文件夹里grafana-enterprise-10.0.1-1.x86_64.rpm 2台机器都装103,104
yum install -y grafana-enterprise-10.0.1-1.x86_64.rpm
安装好后修改grafana.ini文件 指定我们的数据库 103,104都修改
vim /etc/grafana/grafana.ini
[database]
type = mysql
host = 192.168.137.150:3306 #vip的地址
name = grafana
user = grafana
password =wsn456
url = mysql://grafana:wsn456@192.168.137.150:3306/grafana
Grafana 多副本运行,如果配置了告警规则,每个副本都会重复告警,配置一下 ha_peers 让 Grafana 自行选主只让其中一个副本执行告警。
[unified_alerting]
enabled = true
ha_peers = 192.168.137.103:3000
unified_alerting 的 enabled 置为 true,表示开启高可用告警。
unified_alerting 的 ha_peers 填入 Grafana 所有实例的地址,在 k8s 环境可用 headless service,dns 会自动解析到所有 pod ip 来实现自动发现 Grafana 所有 IP,端口默认是 9094,用于 gossip 协议实现高可用。
alerting 的 enabled 置为 false,表示禁用默认的告警方式(每个 Grafana 实例都单独告警)。
[alerting]
enabled = false
分别在192.168.137.103,192.168.137.104 启动grafana
先启动192.168.137.103的grafana,
systemctl enable grafana-server.service --now
Grafana默认端口3000 访问192.168.137.103:3000
默认密码admin/admin
改完密码后,启动104的grafana
systemctl enable grafana-server.service --now
这样 2个主机grafana就数据就同步了
最后一步分别在两台机器上装keepalived
yum install -y keepalived
在103上配置keepalived 跟maraidb配置差不多需要修改
vim /etc/keepalived/keepalived.conf
# 全局配置 不用动 只需注释掉vrrp_strict
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#必须注释掉 否则报错
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# 检查grafana服务是否存活的脚本
vrrp_script chk_grafana {
script "/opt/chk_grafana.sh"
}
# vrrp配置虚IP
vrrp_instance VI_1 {
# 状态:MASTER 另外一台机器为BACKUP
state MASTER
# 绑定的网卡
interface ens33
# 虚拟路由id 两台机器需保持一致
virtual_router_id 60
# 优先级 MASTER的值要大于BACKUP
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP地址 两台keepalived需要一致
virtual_ipaddress {
192.168.137.155
}
# 检查脚本 vrrp_script的名字
track_script {
chk_grafana
}
}
在104上配置keepalived
state BACKUP
priority 99
启动keepalived服务 2台机器都启动
systemctl enable keepalived.service –now
http://192.168.137.155:3000/ 之后就可以一直使用vip来访问了
安装方式可以不用按照我方式来安装 结合实际生产需求
keeplived检查脚本放在文件夹目录里了
拷贝到你的系统/opt目录下 给个执行权限或者755
Mysql的
chmod 755 chk_mysqld.sh
Grafana的
chmod 755 chk_grafana.sh
已安装的 Grafana 如何迁移到高可用架构 ?
如果你用的默认安装,使用 sqlite3 文件存储数据,可以先按照如下步骤迁移数据:
.拿到 grafana.db 文件,使用 Grafana 官方提供的迁移脚本 sqlitedump.sh 将 sqlite3 的数据转换成 sql 文件:sqlitedump.sh grafana.db > grafana.sql
确保环境中安装了 sqlite3 命令。
.停止 Grafana (如果是 K8S 部署,可以修改副本数为 0)。
.准备好数据库,提前创建好 grafana database:CREATEDATABASE grafana;
.替换 Grafana 配置文件,参考前面的配置示例。
.启动 Grafana,让 Grafana 自动初始化数据库。
.将 sql 文件导入数据库执行:mysql -h172.16.181.186 -P3306 -uroot -p123456 grafana < grafana.sql
.恢复 Grafana 运行。
判断脚本
Grafana
#!/bin/bash
if /usr/sbin/pidof grafana &>/dev/null;then
exit 0
else
exit 1
fi
Mariadb
#!/bin/bash
if /usr/sbin/pidof mysqld &>/dev/null;then
exit 0
else
exit 1
fi
No Comments