目录
一、部署前准备
1、查看系统信息
# 查看系统版本
cat /etc/red*
# 查看系统位数
getconf LONG_BIT
[root@localhost ~]# cat /etc/red*
CentOS Linux release 7.5.1804 (Core)
[root@localhost ~]# getconf LONG_BIT
64
2、下载对应安装包
进入MySQL官网:https://dev.mysql.com/downloads/mysql/
可以选择一个自己需要的版本下载,我这里会使用MySQL8.0.37,使用Linux-Generic(通用包),可以先在自己开发机器上直接下载然后上传到Linux服务器中。
3、准备三台服务器
一主两从会使用到三台Linux服务器。
182.168.40.142 (master节点)
182.168.40.141 (slave1节点)
182.168.40.140 (slave2节点)
4、上传安装包到三台服务器
这里自己上传即可,统一上传到一个目录路径即可,方便后续操作,我这里会放在/data/soft目录下二、开始部署(基础部署,主从部署先要完成基础部署,该部分操作需要在所有节点执行)
rpm -qa | grep mariadb 查找mariadb的版本名称(和MySQL冲突,会导致MySQL的3306端口监听不到):如果存在文件,使用rpm -e --nodeps 安装包 删除
主节点和从节点部署其实都差不多,我这里使用xshell操作Linux服务器可以直接将命令同步到所有会话,如果没有类似的工具就只能独立执行。
1、将安装包解压并且移动到目标安装目录
注意:这里的文件是.xz文件,如果你下载的文件是**.tar.gz文件的话用 :tar -zxvf +文件命令
进入安装包存放目录,我这里是cd /data/softtar -Jxvf mysql-8.0.37-linux-glibc2.12-x86_64.tar.xz
不带tar.xz后缀的文件就是我们解压后的安装包,我们将安装包重命名为mysql-8.0.37
mv mysql-8.0.37-linux-glibc2.12-x86_64 /usr/local/mysql-8.0.37
2、编译配置文件my.cnf
这个文件一般是默认存在的,不需要自己手动创建,mysql在初始化是会去寻找这个配置文件,如果没有有则是默认的系统配置
在/etc文件夹下配置my.cnf文件,没有就创建
vim /etc/my.cnf
添加以下参数:
PS:其中有个server-id参数每个节点不能重复,需要独立配置,这一步先不做调整,在后续会进行独立修改。[mysqld]
#设置3306端口
port=3306
#socket=/tmp/mysql.sock
#设置mysql的安装目录
basedir=/usr/local/mysql-8.0.37
#
#设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql-8.0.37/data
#允许最大连接数/
max_connections=10000
#允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
#服务ID(不允许重复,推荐使用该服务器ip后几位)
server-id =142
#是否只读,1代表只读,0代表读写,从库建议设置成只读 SUPER权限可无视该规则(比如root账号)
read-only=0
#
#服务端使用的字符集默认为UTF8
#character-set-server=UTF8
#
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#默认使用“caching_sha2_password”插件认证
default_authentication_plugin=caching_sha2_password
#
[mysql]
#设置mysql客户端默认字符集
default-character-set=utf8
[client]
#设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8
user=mysql
3、创建用户并初始化
在mysql的安装目录下新建文件data
cd /usr/local/mysql-8.0.37/
mkdir data
创建用户组并给用户组权限
groupadd mysql
useradd -rg mysql mysql
chown -R mysql:mysql /usr/local/mysql-8.0.37/
此时ll查看data目录的属组为mysql,如下:
4、初始化mysql数据库
cd /usr/local/mysql-8.0.37
su mysql
./bin/mysqld --initialize
此时会弹出mysql的临时密码,将密码记下来:
5、启动mysql(MySQL用户下)
cd support-files/
./mysql.server start
#Starting MySQL SUCCESS! //意思为成功启动MySQL
#这里注意,如果不是在/usr/local/mysql-8.0.37下安装的mysql,需要在mysql.server文件中将所有路径变量都修改成当前安装目录才能正常启动
6、连接mysql、修改密码、设置远程登陆
exit
./bin/mysql -u root -p
输入临时密码进入MySQL
修改密码:
alter user 'root'@'localhost' identified by 'root';
此时,MySQL的密码就修改为了root
此时我们再用修改后的密码进行验证,看是否可以使用修改后的密码登录MySQL
登录成功!!!
配置允许远程登录
查看访问权限select user,host from mysql.user;
mysql> select user,host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)
root用户的localhost表示只允许本机访问,要实现远程连接,可以将用户的host改为%,表示允许任意主机访问,如果需要设置只允许特定ip访问,则应改为对应的ip。
修改root用户的host字段为%
update mysql.user set host="%" where user="root";
mysql> update mysql.user set host="%" where user="root";
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select user,host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| root | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)
刷新配置
flush privileges;
开放3306端口允许外网访问
先切回root用户在执行以下操作,su root
# 开启指定的端口号
firewall-cmd --add-port=3306/tcp --permanent
# 重启一下防火墙
firewall-cmd --reload
# 查看指定端口号是否开启成功
firewall-cmd --query-port=3306/tcp
[root@localhost data]# firewall-cmd --add-port=3306/tcp --permanent
success
[root@localhost data]# firewall-cmd --reload
success
[root@localhost data]# firewall-cmd --query-port=3306/tcp
yes
这里也可以直接关闭防火墙,如果是自己测试使用可以直接将防火墙关闭
# 查看防火墙状态 active(running)说明防火墙已经被打开
systemctl status firewalld.service
# 临时关闭防火墙
systemctl stop firewalld.service
# 永久关闭防火墙
systemctl disable firewalld.service
# 开启防火墙
systemctl start firewalld.service
关机后再次登录如果报错111,进入 support-files/目录 输入:./mysql.server restart 重启mysql,返回上一级重新登录即可
三、将MySQL添加到环境变量中
通过编译安装的MySQL必须在support-files文件下执行命令才能进行开启、关闭重启等服务功能,如果想在linux任何目录下都可以进行这些功能就需要将其添加到环境变量中
1、将MySQL命令添加到环境变量
vim /etc/profile
末尾添加以下内容:
PATH=$PATH:/usr/local/mysql-8.0.37/bin:/usr/local/mysql-8.0.37/bin
export PATH
保存退出
source /etc/profile # 重新加载环境变量配置脚本
2、将MySQL的启动等服务添加到环境变量
cp /usr/local/mysql-8.0.37/support-files/mysql.server /etc/init.d/mysql
#检查一下复制过去的文件中的basedir= 和datadir= 后的路径和原先是否一致,不一致需要修改一致
此时就可在任意目录下对MySQL进行重启、关闭等功能,例如
service mysql restart # 重启MySQL
service mysql start # 开启MySQL
service mysql stop # 暂停MySQL
service mysql enable # 开机自启MySQL
或者
systemctl restart mysql # 重启MySQL
systemctl start mysql # 开启MySQL
systemctl stop mysql # 暂停MySQL
systemctl enable mysql # 开机自启MySQL
现在可以在任意目录下使用mysql命令进入MySQL
mysql -u root -p
四、主从复制部署
1、修改从节点配置文件my.cnf中的server-id
在集群部署中每台节点的server-id不能重复,这里进行单独修改。vi /etc/my.cnf
找到配置文件中的server-id配置,将该配置修改成不重复即可,我这里会使用ip的最后几位,如果想将从库设置成只读还可以将read-only配置成只读
# 182.168.40.141 (slave1节点)
server-id = 141
# 192.168.40.140 (slave2节点)
server-id = 140
修改完成后保存,并且重启两台从节点即可
service mysql restart
2、在主节点创建主从复制的独立账号
这里其实也可以直接使用root账号,但是root账号权限太大测试的时候可以使用,生产还是建议使用独立的主从复制账号。# 使用root账号登录数据库
mysql -uroot -proot
# 创建slave用户,并设置密码,并设置该用户可在任意主机连接该MySQL服务
mysql> create user 'slave'@'%' identified with mysql_native_password by 'root';
# 为slave用户分配主从复制权限
mysql> grant replication slave on *.* to 'slave'@'%';
# 刷新
mysql> flush privileges;
在主节点查看binlog记录的File和Position值,从节点同步时需要指定这两个值
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql_bin.000010 | 157 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
在从库执行主从复制操作
配置主从复制时不做特殊处理主库是不用有任何调整的,除非没有开启binlog日志记录,这里开始进行主从复制操作。
两台从节点先使用root账号登录
mysql -uroot -proot
执行主从复制操作
# 执行前先停止slave
stop slave;
# 这是从库和主库连接的关键一步,host是主库的ip,user是前面创建的slave用户,file和pos是主库show master status的信息
change master to
master_host='192.168.40.142',master_user='slave',master_password='root',
master_log_file='mysql_bin.000010',master_log_pos=157;
# 执行后启动slave
start slave;
mysql> stop slave;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> change master to
-> master_host='192.168.40.142',master_user='slave',master_password='root',
-> master_log_file='mysql_bin.000010',master_log_pos=157;
Query OK, 0 rows affected, 8 warnings (0.02 sec)
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
查看主从复制开启状态
show slave status\G;
两个yes则表示成功配置主从复制,Connection和No都是配置有问题
3、开始测试主从复制效果
在主库创建一个新的数据库CREATE DATABASE test;
进入数据库创建一张测试用户表
# 进入刚刚创建的数据库
use test;
# 执行创建用户表语句
CREATE TABLE user_info (
id INT AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
age INT,
PRIMARY KEY (id)
);
在表中写入一条数据
INSERT INTO user_info (name, age) VALUES ('张三', 99);
查看从库中是否同步到了主库的数据库、表、数据
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.04 sec)
mysql> use test;
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> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user_info |
+----------------+
1 row in set (0.01 sec)
mysql> select*from user_info;
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | 张三 | 99 |
+----+--------+------+
1 row in set (0.00 sec)