Mysql5.7.29主从集群(草稿)
一. Linux 安装&下载 MySQL5.7.29
wget -c https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar
解压MySQL
tar -xvf mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar
查看CentOS7中是否安装 mariadb
rpm -qa|grep mariadb
rpm -qa|grep mariadb*
卸载 mariadb 及相关(有什么就卸载什么)
yum remove mariadb
yum remove mariadb-libs
卸载配置文件
rm -f /etc/my.cnf
删除数据目录
rm -rf /var/lib/mysql/
安装 libaio 、perl,net-tools 依赖(安装过程中缺什么装什么)
# 查看libaio、perl,net-tools有什么版本
yum list | grep libaio (perl,net-tools)
yum install -y libaio.x86_64
安装MySQL 的rpm包(这里我们只需要安装Server、与Client)
sudo rpm -ivh mysql-community-server-5.7.29-1.el7.x86_64.rpm
# 如果报错 + 上 “--nodeps”
# 原因:这是由于yum安装了旧版本的GPG keys造成的 解决办法:后面加上 --force --nodeps
sudo rpm -ivh mysql-community-server-5.7.29-1.el7.x86_64.rpm --nodeps
rpm -ivh mysql-community-client-5.7.29-1.el7.x86_64.rpm --nodeps
创建mysql的数据与日志存储位置(一般存储到data数据盘)
# 数据库数据存储目录
mkdir -p /data/mysql
# 数据库日志存储目录
mkdir -p /data/mysql/log
创建mysql用户组
groupadd mysql
创建mysql用户
useradd -r -s /sbin/nologin -g mysql mysql -d /usr/bin/mysql
创建数据盘里的mysql包及其它相关路径
mkdir -p /data/mysql/data
mkdir -p /data/mysql/log
mkdir -p /data/mysql/binlog
mkdir -p /data/mysql/share
# 变更权限
chown -R mysql:mysql /data/mysql/data
chown -R mysql:mysql /data/mysql/log
chown -R mysql:mysql /data/mysql/binlog
chown -R mysql:mysql /data/mysql/share
编辑MySQL常规配置(根据上面路径配置)
vim /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysql]
# 默认的数据库字符集
default-character-set=utf8mb4
# 错误日志文件
messages = en_US
lc-messages-dir = /data/mysql/share
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
# 事物引擎
default-storage-engine=INNODB
# 默认字符集
character_set_server=utf8mb4
# 时间戳配置(解决初始化错误问题)
explicit_defaults_for_timestamp=true
# 错误日志文件
lc-messages = en_US
lc-messages-dir = /data/mysql/share
# 单独设置binlog 日志路径,最好与数据目录分开,设置到不同磁盘分区,这样提高IO效率
log-bin = /data/mysql/binlog/mysql-bin.log
# 服务器唯一标识,启动binlog日志就必须设置唯一id ,否则无法启动
server-id=1
log_bin_index=/data/mysql/binlog/mysql-bin.index
# 主从同步采用此种格式的binlog
binlog-format=MIXED
# binlog 优化配置
binlog_cache_size = 1M
max_binlog_cache_size = 128M
max_binlog_size = 1G
# 连接池优化
max_connections = 512
# 表文件描述符的缓存大小优化
table_open_cache = 2048
# 链接池首次分配内存大小
sort_buffer_size = 1M
# 语句内关联分配内存大小
join_buffer_size = 2M
# 查询结果传输最大值优化
max_allowed_packet = 128M
datadir=/data/mysql/data
basedir=/usr/sbin
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/data/mysql/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysqld_safe]
# 增加错误日志,当数据库无法启动等问题时会产生错误日志,通过日志来排查问题
log-error = /data/mysql/log/error.log
初始化MySQL数据库【一定要记住初始化密码,可以在log的最上行找到初始密码】
mysqld --initialize --defaults-file=/etc/my.cnf --user=mysql --basedir=/usr/sbin --datadir=/data/mysql/data
MySQL数据库加密
mysql_ssl_rsa_setup --datadir=/data/mysql/data
MySQL 主从同步配置(Master)
vim /etc/my.cnf
# id 设置为内网地址最后一段
server-id=28
log_bin=master-bin
log_bin_index=master-bin.index
binlog_do_db=test
binlog_do_db = mysql
#备注:
#server-id 服务器唯一标识。
#log_bin 启动MySQL二进制日志,即数据同步语句,从数据库会一条一条的执行这些语句。
#binlog_do_db 指定记录二进制日志的数据库,即需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可。
#binlog_ignore_db 指定不记录二进制日志的数据库,即不需要复制的数据库名,如果有多个数据库,重复设置这个选项即可。
#其中需要注意的是,binlog_do_db和binlog_ignore_db为互斥选项,一般只需要一个即可
启动MySQL Server
# 查看启动命令List
systemctl list-unit-files --type=service | grep mysql
# 运行命令
systemctl start mysqld.service
如果发现报错
Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
# 查看 log 日志,对应处理
cat /data/mysql/log/mysqld.log
通过初始密码登录改一个新密码
mysqladmin -uroot -p密码 password 新密码
如果密码忘记了
# 配置文件中添加:
skip-grant-tables
# 重启mysql
systemctl restart mysqld.service
# 不需要密码可以直接登陆
mysql -uroot -p
在Master上创建从服务器权限
# IP地址,写 backup节点的IP地址。重点是前面的 replication slave
grant replication slave on *.* to masterbackup@'192.168.x.%' identified by '123456';
#备注
#192.168.17.%通配符,表示0-255的IP都可访问主服务器,正式环境请配置指定从服务器IP
#若将 192.168.17.% 改为 %,则任何ip均可作为其从数据库来访问主服务器
退出mysql
mysql> exit;
service mysql restart
mysql -uroot -p
show master status; #记录pos 位置,和日志文件名字
二. 将MySQL包Copy 到其它节点
1. 重复上面Master步骤
截止到常规配置(过程略....)
2. 将常规配置中, Master 的部分更替为 如下(slave):
# 从机 01
vim /etc/my.cnf
# id 设置为内网地址最后一段
server-id=1
# slave只读限制
read-only =1
binlog_do_db = test
binlog_do_db = mysql
relay-log=slave-relay-bi
relay-log-index=slave-relay-bin.index
# 从机 27
vim /etc/my.cnf
# id 设置为内网地址最后一段
server-id=27
# slave只读限制
read-only =1
binlog_do_db = test
binlog_do_db = mysql
relay-log=slave-relay-bi
relay-log-index=slave-relay-bin.index
3. 从节点数据库初始化
4. 从节点数据库加密
5. 启动mysql服务
systemctl start mysqld.service
5. 启动同步
# 链接 slave 01、27[密码去初始化的日志里找]
mysql -uroot -p
# 初始化密码
SET PASSWORD = PASSWORD('新密码');
# 停止从机同步
stop slave;
# 注意 :master_host,master_port,master_user
# 注意2: master_log_file 跟 master_log_pos 跟 master 上的截图一致;【主机上 show master status;】
change master to master_host='192.168.1.1',master_port=88306,master_user='masterbackup',master_password='123456',master_log_file='master-bin.000004',master_log_pos=154;
# 启动从机同步
start slave
show slave status\G; #查看状态是否正常
# 备注:
# master_log_file,master_log_pos 为在主上执行show master status命令查看获得信息
# show slave status;\G 查看状态如下全为yes 即可,否则配置有问题
# Slave_SQL_Running: Yes
# Slave_IO_Running: Yes
Master 创建用户(详细可见最下方【权限控制】)
# 普通用户所有权限
grant all privileges on *.* to "用户"@'网段%' identified by '密码';
# 收回super权限
revoke super on *。* from '用户'@"%";
slave 创建数据同步用户(与master一致)
# root 用户登陆
mysql -uroot -p
# 配置数据同步用户
grant replication slave on *.* to masterbackup@'192.168.x.%' identified by '123456';
测试
登录mysql 主
选择test 数据库,创建如下表
# 创建测试库
create database test;
# 使用test库
use test;
# 创建测试表
create table slave_test(id int(6),name varchar(10));
# 插入测试数据
insert into slave_test values(000001,'weiyang');
# 刷新
FLUSH PRIVILEGES;
# 查看
show tables;
select * from slave_test;
maxscale 安装(实现读写分离)
安装 maxscale
# 下载 maxscale
wget https://downloads.mariadb.com/MaxScale/1.4.5-debug/centos/7server/x86_64/maxscale-1.4.5-1.centos.7.x86_64.rpm
# 安装
rpm -ivh maxscale-1.4.5-1.centos.7.x86_64.rpm
3.主服务器上创建账号
#监控账号
create user scalemon@’192.168.0.%’ identified by ‘123456’;
grant replication slave, replication client on *.* to scalemon@’192.168.0.%’;
#路由账号
create user maxscale@’192.168.0.%’ identified by ‘123456’;
grant select on mysql.* to maxscale@’192.168.0.%’ ;
配置MaxScale/etc/maxscale.cnf
vim /etc/maxscale.cnf
# MaxScale documentation on GitHub:
# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Documentation-Contents.md
# Global parameters
#
# Complete list of configuration options:
# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Getting-Started/Configuration-Guide.md
[maxscale]
threads=1
# Server definitions
#
# Set the address of the server to the network
# address of a MySQL server.
#
[server1]
type=server
address=192.168.0.xx
port=3306
protocol=MySQLBackend
[server2]
type=server
address=192.168.0.xx
port=3306
protocol=MySQLBackend
[server3]
type=server
address=192.168.0.xx
port=3306
protocol=MySQLBackend
# Monitor for the servers
#
# This will keep MaxScale aware of the state of the servers.
# MySQL Monitor documentation:
# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Monitors/MySQL-Monitor.md
[MySQL-Monitor]
type=monitor
module=mysqlmon
servers=server1,server2,server3
user=监控
passwd=监控密码
monitor_interval=10000
detect_stale_master=true
# Service definitions
#
# Service Definition for a read-only service and
# a read/write splitting service.
#
# ReadConnRoute documentation:
# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Routers/ReadConnRoute.md
# [Read-Only Service]
# type=service
# router=readconnroute
# servers=server1
# user=myuser
# passwd=mypwd
# router_options=slave
# ReadWriteSplit documentation:
# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Routers/ReadWriteSplit.md
[Read-Write-Service]
# type=service
type=service
router=readwritesplit
servers=server1,server2,server3
user=路由
passwd=路由密码
max_slave_connections=100%
max_slave_replication_lag=60
use_sql_variables_in=all
# This service enables the use of the MaxAdmin interface
# MaxScale administration guide:
# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Reference/MaxAdmin.md
[MaxAdmin-Service]
type=service
router=cli
# Listener definitions for the services
#
# These listeners represent the ports the
# services will listen on.
#
# [Read-Only Listener]
# type=listener
# service=Read-Only Service
# protocol=MySQLClient
# port=4008
[Read-Write-Listener]
type=listener
service=Read-Write-Service
protocol=MySQLClient
port=7306
[MaxAdmin-Listener]
type=listener
service=MaxAdmin-Service
protocol=maxscaled
port=7305
socket=default
启动MaxScale服务
maxscale --config=/etc/maxscale.cnf
进入MaxScale的管理窗口
#默认用户名密码 admin;mariadb
maxadmin --user=admin --password=mariadb -P端口号
登录 MaxScale 管理器,查看一下数据库连接状态
list servers
可以看到,MaxScale 已经连接到了 master 和 slave
测试
先在 master 上创建一个测试用户
使用 Mysql 客户端到连接 MaxScale
Select @@hostname;
start transaction;
Select @@hostname;
roolback;
Select @@hostname;
开启事务后,就自动路由到了 master,普通的查询操作,是在 slave上。
总结
通过MaxScale可以很轻松的实现MySQL数据库的读写分离和负载均衡。
三. 权限管理
我们知道我们的最高权限管理者是root用户,它拥有着最高的权限操作。包括select、update、delete、update、grant等操作。那么一般情况在公司之后DBA工程师会创建一个用户和密码,让你去连接数据库的操作,并给当前的用户设置某个操作的权限(或者所有权限)。那么这时就需要我们来简单了解一下:
如何创建用户和密码
给当前的用户授权
移除当前用户的权限
如果你想创建一个新的用户,则需要以下操作:
进入到mysql数据库下
mysql> use mysql
Database changed
对新用户增删改
对当前的用户授权管理
MySql备份命令行操作
# 备份:数据表结构+数据
mysqdump -u root db1 > db1.sql -p
# 备份:数据表结构
mysqdump -u root -d db1 > db1.sql -p
#导入现有的数据到某个数据库
#1.先创建一个新的数据库
create database db10;
# 2.将已有的数据库文件导入到db10数据库中
mysqdump -u root -d db10 < db1.sql -p