資料庫mysql的部署,伺服器怎麼部署mysql

本文目錄一覽:

k8s中的Mysql資料庫持久化存儲

 

一、配置:

環境:

CentOS7 

VMware

筆者配置了四台虛擬機:

K8S-Master節點: 3GB內存   2核CPU   20GB硬碟空間

K8S-node1節點:  2GB內存   2核CPU   30GB硬碟空間

K8S-node2節點:  2GB內存   2核CPU   30GB硬碟空間

鏡像倉庫節點:      2GB內存   2核CPU   50GB硬碟空間

二、節點規劃:

使用三台虛擬機搭建K8S集群,使用一台虛擬機搭建鏡像倉庫。

每台虛擬機配置兩塊網卡,其中一塊為「NAT模式」,用於拉取鏡像等功能。

另外一塊網卡為「僅主機模式」,用於集群節點間的通信。歸劃如下:

K8s-master節點:

僅主機模式:10.10.10.200

NAT模式:  192.168.200.130

K8S-node1節點:

僅主機模式:10.10.10.201

NAT模式:  192.168.200.131

K8S-node2節點:

僅主機模式:10.10.10.202

NAT模式:  192.168.200.132

鏡像倉庫節點:

僅主機模式:10.10.10.101

NAT模式:  192.168.200.150

三、版本信息

Linux內核版本:

Linux version 3.10.0-862.el7.x86_64 (builder@kbuilder.dev.centos.org)

(gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) )

 #1 SMP Fri Apr 20 16:44:24 UTC 2018

K8s集群版本為1.15.0版本:

四、基於StatefulSet與PV/PVC的MySql持久化存儲實驗

1. 在每個節點安裝nfs服務

在「鏡像倉庫」節點,執行以下命令:

yum install -y nfs-common nfs-utils rpcbind

在k8s集群,執行以下命令:

yum install -y nfs-utils rpcbind

2. 在「鏡像倉庫」節點下,配置nfs伺服器

mkdir /nfs_mysql

Chmod 777 /nfs_mysql/

(在測試環境中,為了不考慮用戶屬性,暫時賦予777許可權,但在生產環境不推薦這樣做)

Chown nfsnobody /nfs_mysql/

echo 「/nfs_mysql *(rw,no_root_squash,no_all_squash,sync)」  /etc/exports

cat /etc/exports

/nfs_mysql *(rw,no_root_squash,no_all_squash,sync)

systemctl start rpcbind

systemctl start nfs

3. 測試nfs服務是否可用

mkdir /test

showmount -e 10.10.10.101

可見/nfs_mysql *已暴露於共享目錄,接下來測試掛載是否可用:

在master節點下執行:

mount -t nfs 10.10.10.101:/nfs_mysql /test/

echo “hello-world”/test/1.txt

在鏡像倉庫節點下查看1.txt是否存在,若存在則掛載成功:

可見nfs服務可以正常使用,接下來刪除test目錄和1.txt

在鏡像倉庫下:

[root@hub nfs_mysql]# rm -f 1.txt

在Master節點下:

[root@k8s-master ~]# umount /test/

[root@k8s-master ~]# rm -rf /test/

同理,依照以上步驟同時創建:(提供多個mysql副本進行掛載)

nfs_mysql1

nfs_mysql2

完成後需要重啟nfs服務

systemctl restart rpcbind

systemctl restart nfs

最終效果:

4. 將nfs封裝成pv

創建mysql_test文件夾,將yaml文件統一保存在此目錄下

mkdir mysql_test

cd mysql_test

vim mysql-pv.yml

mysql-pv.yml配置如下:

apiVersion: v1

kind: PersistentVolume

metadata:

  name: mysql-pv

spec:

  capacity:

    storage: 5Gi

  accessModes:

    –  ReadWriteOnce

  persistentVolumeReclaimPolicy: Retain

  storageClassName: nfs

  nfs:

    path: /nfs_mysql

    server: 10.10.10.101

apiVersion: v1

kind: PersistentVolume

metadata:

  name: mysql-pv1

spec:

  capacity:

    storage: 5Gi

  accessModes:

    –  ReadWriteOnce

  persistentVolumeReclaimPolicy: Retain

  storageClassName: nfs

  nfs:

    path: /nfs_mysql1

    server: 10.10.10.101

apiVersion: v1

kind: PersistentVolume

metadata:

  name: mysql-pv2

spec:

  capacity:

    storage: 5Gi

  accessModes:

    –  ReadWriteOnce

  persistentVolumeReclaimPolicy: Retain

  storageClassName: nfs

  nfs:

    path: /nfs_mysql2

    server: 10.10.10.101

注意:

在k8s集群15版本中recycle回收策略已被刪除,只能用retain策略或者Delete策略。這裡我們使用 persistentVolumeReclaimPolicy: Retain

 

執行命令:

kubectl create -f mysql-pv.yml

kubectl get pv

如圖所示,即為Pv創建成功。

5. 部署MySQL,在mysql_test目錄下編寫mysql.yml,配置文件如下

apiVersion: v1

kind: Service

metadata:

  name: mysql

  labels:

    app: mysql

spec:

  ports:

  – port: 3306

    name: mysql

  clusterIP: None

  selector:

    app: mysql

apiVersion: apps/v1

kind: StatefulSet

metadata:

  name: mysql

spec:

  selector:

    matchLabels:

      app: mysql

  serviceName: “mysql”

  replicas: 3

  template:

    metadata:

      labels:

        app: mysql

    spec:

      containers:

      – name: mysql

        image: mysql:5.6

        env:

        – name: MYSQL_ROOT_PASSWORD

          value: password

        ports:

        – containerPort: 3306

          name: mysql

        volumeMounts:

        – name: mysql-persistent-storage

          mountPath: /var/lib/mysql

  volumeClaimTemplates:

  – metadata:

      name: mysql-persistent-storage

    spec:

      accessModes: [“ReadWriteOnce”]

      storageClassName: “nfs”

      resources:

        requests:

          storage: 1Gi  

執行以下命令,部署mysql服務:

kubectl create -f mysql.yml

如圖可知,mysql按StatefulSet依次創建了mysql-0 mysql-1 mysql-2

查看各個Pod部在哪個節點:

6. 通過創建臨時容器,使用MySQL客戶端發送測試請求給MySQL master節點

注意:

主機名為mysql-0.mysql;跨命名空間的話,主機名請使用mysql-0.mysql. [NAMESPACE_NAME].如果沒有指定命名空間,默認為default,即 mysql-0.mysql. default。

   

這裡筆者打算關閉node2節點來模擬node2宕機,來測試是否實現數據的持久化存儲,

所以我們向node2上的mysql1寫入數據。

 

執行以下命令,訪問mysql1:

kubectl run mysql-client –image=mysql:5.6 -it –rm –restart=Never — mysql -h mysql-1.mysql.default -p password

創建資料庫demo,並向messages表中寫入hello-world

CREATE DATABASE demo; 

CREATE TABLE demo.messages (message VARCHAR(250)); 

INSERT INTO demo.messages VALUES (‘hello-world’);

如圖所示

接下來我們來關閉k8s-node2虛擬機,模擬宕機

查看nodes的運行狀態,可知node2的狀態已轉變為NotReady

一段時間後,k8s將Pod MySql -1遷移到節點k8s-node1

由於時間過長,筆者把三個Pod都刪除重啟後,驗證數據:

MySQL服務恢復,數據完好無損!

MySQL 主從,5 分鐘帶你掌握

MySQL 主從一直是面試常客,裡面的知識點雖然基礎,但是能回答全的同學不多。

比如樓哥之前面試小米,就被問到過主從複製的原理,以及主從延遲的解決方案,因為回答的非常不錯,給面試官留下非常好的印象。你之前面試,有遇到過哪些 MySQL 主從的問題呢?

所謂 MySQL 主從,就是建立兩個完全一樣的資料庫,一個是主庫,一個是從庫, 主庫對外提供讀寫的操作,從庫對外提供讀的操作 ,下面是一主一從模式:

對於資料庫單機部署,在 4 核 8G 的機器上運行 MySQL 5.7 時,大概可以支撐 500 的 TPS 和 10000 的 QPS, 當遇到一些活動時,查詢流量驟然,就需要進行主從分離。

大部分系統的訪問模型是讀多寫少,讀寫請求量的差距可能達到幾個數量級,所以我們可以通過一主多從的方式, 主庫只負責寫入和部分核心邏輯的查詢,多個從庫只負責查詢,提升查詢性能,降低主庫壓力。

MySQL 主從還能做到服務高可用,當主庫宕機時,從庫可以切成主庫,保證服務的高可用,然後主庫也可以做數據的容災備份。

整體場景總結如下:

MySQL 的主從複製是依賴於 binlog 的,也就是記錄 MySQL 上的所有變化並以二進位形式保存在磁碟上二進位日誌文件。

主從複製就是將 binlog 中的數據從主庫傳輸到從庫上,一般這個過程是非同步的,即主庫上的操作不會等待 binlog 同步的完成。

詳細流程如下:

當主庫和從庫數據同步時,突然中斷怎麼辦?因為主庫與從庫之間維持了一個長鏈接,主庫內部有一個線程,專門服務於從庫的這個長鏈接的。

對於下面的情況,假如主庫執行如下 SQL,其中 a 和 create_time 都是索引:

我們知道,數據選擇了 a 索引和選擇 create_time 索引,最後 limit 1 出來的數據一般是不一樣的。

所以就會存在這種情況:在 binlog = statement 格式時,主庫在執行這條 SQL 時,使用的是索引 a,而從庫在執行這條 SQL 時,使用了索引 create_time,最後主從數據不一致了。

那麼我們改如何解決呢?

可以把 binlog 格式修改為 row,row 格式的 binlog 日誌記錄的不是 SQL 原文,而是兩個 event:Table_map 和 Delete_rows。

Table_map event 說明要操作的表,Delete_rows event用於定義要刪除的行為,記錄刪除的具體行數。 row 格式的 binlog 記錄的就是要刪除的主鍵 ID 信息,因此不會出現主從不一致的問題。

但是如果 SQL 刪除 10 萬行數據,使用 row 格式就會很占空間的,10 萬條數據都在 binlog 裡面,寫 binlog 的時候也很耗 IO。但是 statement 格式的 binlog 可能會導致數據不一致。

設計 MySQL 的大叔想了一個折中的方案,mixed 格式的 binlog,其實就是 row 和 statement 格式混合使用, 當 MySQL 判斷可能數據不一致時,就用 row 格式,否則使用就用 statement 格式。

有時候我們遇到從資料庫中獲取不到信息的詭異問題時,會糾結於代碼中是否有一些邏輯會把之前寫入的內容刪除,但是你又會發現,過了一段時間再去查詢時又可以讀到數據了,這基本上就是主從延遲在作怪。

主從延遲,其實就是「從庫回放」 完成的時間,與 「主庫寫 binlog」 完成時間的差值, 會導致從庫查詢的數據,和主庫的不一致 。

談到 MySQL 資料庫主從同步延遲原理,得從 MySQL 的主從複製原理說起:

總結一下主從延遲的主要原因 :主從延遲主要是出現在 「relay log 回放」 這一步,當主庫的 TPS 並發較高,產生的 DDL 數量超過從庫一個 SQL 線程所能承受的範圍,那麼延時就產生了,當然還有就是可能與從庫的大型 query 語句產生了鎖等待。

我們一般會把從庫落後的時間作為一個重點的資料庫指標做監控和報警,正常的時間是在毫秒級別,一旦落後的時間達到了秒級別就需要告警了。

解決該問題的方法,除了縮短主從延遲的時間,還有一些其它的方法,基本原理都是盡量不查詢從庫。

具體解決方案如下:

在實際應用場景中,對於一些非常核心的場景,比如庫存,支付訂單等,需要直接查詢從庫,其它非核心場景,就不要去查主庫了。

兩台機器 A 和 B,A 為主庫,負責讀寫,B 為從庫,負責讀數據。

如果 A 庫發生故障,B 庫成為主庫負責讀寫,修復故障後,A 成為從庫,主庫 B 同步數據到從庫 A。

一台主庫多台從庫,A 為主庫,負責讀寫,B、C、D為從庫,負責讀數據。

如果 A 庫發生故障,B 庫成為主庫負責讀寫,C、D負責讀,修復故障後,A 也成為從庫,主庫 B 同步數據到從庫 A。

linux 怎麼部署mysql資料庫

創建用於執行mysql服務程序的帳號:

[root@linuxprobe cmake-2.8.11.2]# cd ..

[root@linuxprobe src]# useradd mysql -s /sbin/nologin

創建資料庫程序和文件的目錄,並設置目錄的所屬與所組:

[root@linuxprobe src]# mkdir -p /usr/local/mysql/var

[root@linuxprobe src]# chown -Rf mysql:mysql /usr/local/mysql

安裝Mysql服務程序(解壓與編譯過程已省略):

[root@linuxprobe src]# tar xzvf mysql-5.6.19.tar.gz

[root@linuxprobe src]# cd mysql-5.6.19/

[root@linuxprobe mysql-5.6.19]# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/var -DSYSCONFDIR=/etc

[root@linuxprobe mysql-5.6.19]# make

[root@linuxprobe mysql-5.6.19]# make install

刪除系統默認的配置文件:

[root@linuxprobe mysql-5.6.19]# rm -rf /etc/my.cnf

生成系統資料庫(生成信息已省略):

[root@linuxprobe mysql-5.6.19]# cd /usr/local/mysql

[root@linuxprobe mysql]# ./scripts/mysql_install_db –user=mysql –basedir=/usr/local/mysql –datadir=/usr/local/mysql/var

創建配置文件的軟連接文件:

[root@linuxprobe mysql]# ln -s my.cnf /etc/my.cnf

將mysqld服務程序添加到開機啟動項:

[root@linuxprobe mysql]# cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld

[root@linuxprobe mysql]# chmod 755 /etc/init.d/mysqld

[root@linuxprobe mysql]# chkconfig mysqld on

編輯啟動項的配置文件:

[root@linuxprobe mysql]# vim /etc/rc.d/init.d/mysqld

//分別修改第46與47行,basedir為程序安裝路徑,datadir為資料庫存放目錄。

basedir=/usr/local/mysql

datadir=/usr/local/mysql/var

重啟mysqld服務程序:

[root@localhost mysql]# service mysqld start

Starting MySQL. SUCCESS!

把mysql服務程序命令目錄添加到環境變數中(永久生效):

[root@linuxprobe mysql]# vim /etc/profile

//在配置文件的最下面追加:

export PATH=$PATH:/usr/local/mysql/bin

[root@linuxprobe mysql]# source /etc/profile

將mysqld服務程序的庫文件鏈接到默認的位置:

[root@linuxprobe mysql]# mkdir /var/lib/mysql

[root@linuxprobe mysql]# ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql

[root@linuxprobe mysql]# ln -s /usr/local/mysql/include/mysql /usr/include/mysql

[root@linuxprobe mysql]# ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock

初始化mysqld服務程序:

[root@linuxprobe mysql]# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL

SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!

In order to log into MySQL to secure it, we’ll need the current

password for the root user. If you’ve just installed MySQL, and

you haven’t set the root password yet, the password will be blank,

so you should just press enter here.

Enter current password for root (enter for none):

OK, successfully used password, moving on…

Setting the root password ensures that nobody can log into the MySQL

root user without the proper authorisation.

Set root password? [Y/n] y

New password: 輸入要為root用戶設置的資料庫密碼。

Re-enter new password: 重複再輸入一次密碼。

Password updated successfully!

Reloading privilege tables..

… Success!

By default, a MySQL installation has an anonymous user, allowing anyone

to log into MySQL without having to have a user account created for

them. This is intended only for testing, and to make the installation

go a bit smoother. You should remove them before moving into a

production environment.

Remove anonymous users? [Y/n] y(刪除匿名帳號)

… Success!

Normally, root should only be allowed to connect from ‘localhost’. This

ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y(禁止root用戶從遠程登陸)

… Success!

By default, MySQL comes with a database named ‘test’ that anyone can

access. This is also intended only for testing, and should be removed

before moving into a production environment.

Remove test database and access to it? [Y/n] y(刪除test資料庫並取消對其的訪問許可權)

– Dropping test database…

… Success!

– Removing privileges on test database…

… Success!

Reloading the privilege tables will ensure that all changes made so far

will take effect immediately.

Reload privilege tables now? [Y/n] y(刷新授權表,讓初始化後的設定立即生效)

… Success!

All done! If you’ve completed all of the above steps, your MySQL

installation should now be secure.

Thanks for using MySQL!

Cleaning up…

可以百度搜索Linux就該這麼學,第9章 使用Apache服務部署靜態網站,裡面有部署mysql的資料

五大常見的MySQL高可用方案(最全)

1. 概述

我們在考慮MySQL資料庫的高可用的架構時,主要要考慮如下幾方面:

如果資料庫發生了宕機或者意外中斷等故障,能儘快恢復資料庫的可用性,儘可能的減少停機時間,保證業務不會因為資料庫的故障而中斷。

用作備份、只讀副本等功能的非主節點的數據應該和主節點的數據實時或者最終保持一致。

當業務發生資料庫切換時,切換前後的資料庫內容應當一致,不會因為數據缺失或者數據不一致而影響業務。

關於對高可用的分級在這裡我們不做詳細的討論,這裡只討論常用高可用方案的優缺點以及高可用方案的選型。

2. 高可用方案

2.1. 主從或主主半同步複製

使用雙節點資料庫,搭建單向或者雙向的半同步複製。在5.7以後的版本中,由於lossless replication、logical多線程複製等一些列新特性的引入,使得MySQL原生半同步複製更加可靠。

常見架構如下:

通常會和proxy、keepalived等第三方軟體同時使用,即可以用來監控資料庫的 健康 ,又可以執行一系列管理命令。如果主庫發生故障,切換到備庫後仍然可以繼續使用資料庫。

優點:

架構比較簡單,使用原生半同步複製作為數據同步的依據;

雙節點,沒有主機宕機後的選主問題,直接切換即可;

雙節點,需求資源少,部署簡單;

缺點:

完全依賴於半同步複製,如果半同步複製退化為非同步複製,數據一致性無法得到保證;

需要額外考慮haproxy、keepalived的高可用機制。

2.2. 半同步複製優化

半同步複製機制是可靠的。如果半同步複製一直是生效的,那麼便可以認為數據是一致的。但是由於網路波動等一些客觀原因,導致半同步複製發生超時而切換為非同步複製,那麼這時便不能保證數據的一致性。所以儘可能的保證半同步複製,便可提高數據的一致性。

該方案同樣使用雙節點架構,但是在原有半同複製的基礎上做了功能上的優化,使半同步複製的機制變得更加可靠。

可參考的優化方案如下:

2.2.1. 雙通道複製

半同步複製由於發生超時後,複製斷開,當再次建立起複制時,同時建立兩條通道,其中一條半同步複製通道從當前位置開始複製,保證從機知道當前主機執行的進度。另外一條非同步複製通道開始追補從機落後的數據。當非同步複製通道追趕到半同步複製的起始位置時,恢復半同步複製。

2.2.2. binlog文件伺服器

搭建兩條半同步複製通道,其中連接文件伺服器的半同步通道正常情況下不啟用,當主從的半同步複製發生網路問題退化後,啟動與文件伺服器的半同步複製通道。當主從半同步複製恢復後,關閉與文件伺服器的半同步複製通道。

優點:

雙節點,需求資源少,部署簡單;

架構簡單,沒有選主的問題,直接切換即可;

相比於原生複製,優化後的半同步複製更能保證數據的一致性。

缺點:

需要修改內核源碼或者使用mysql通信協議。需要對源碼有一定的了解,並能做一定程度的二次開發。

依舊依賴於半同步複製,沒有從根本上解決數據一致性問題。

2.3. 高可用架構優化

將雙節點資料庫擴展到多節點資料庫,或者多節點資料庫集群。可以根據自己的需要選擇一主兩從、一主多從或者多主多從的集群。

由於半同步複製,存在接收到一個從機的成功應答即認為半同步複製成功的特性,所以多從半同步複製的可靠性要優於單從半同步複製的可靠性。並且多節點同時宕機的幾率也要小於單節點宕機的幾率,所以多節點架構在一定程度上可以認為高可用性是好於雙節點架構。

但是由於資料庫數量較多,所以需要資料庫管理軟體來保證資料庫的可維護性。可以選擇MMM、MHA或者各個版本的proxy等等。常見方案如下:

2.3.1. MHA+多節點集群

MHA Manager會定時探測集群中的master節點,當master出現故障時,它可以自動將最新數據的slave提升為新的master,然後將所有其他的slave重新指向新的master,整個故障轉移過程對應用程序完全透明。

MHA Node運行在每台MySQL伺服器上,主要作用是切換時處理二進位日誌,確保切換盡量少丟數據。

MHA也可以擴展到如下的多節點集群:

優點:

可以進行故障的自動檢測和轉移;

可擴展性較好,可以根據需要擴展MySQL的節點數量和結構;

相比於雙節點的MySQL複製,三節點/多節點的MySQL發生不可用的概率更低

缺點:

至少需要三節點,相對於雙節點需要更多的資源;

邏輯較為複雜,發生故障後排查問題,定位問題更加困難;

數據一致性仍然靠原生半同步複製保證,仍然存在數據不一致的風險;

可能因為網路分區發生腦裂現象;

2.3.2. zookeeper+proxy

Zookeeper使用分散式演算法保證集群數據的一致性,使用zookeeper可以有效的保證proxy的高可用性,可以較好的避免網路分區現象的產生。

優點:

較好的保證了整個系統的高可用性,包括proxy、MySQL;

擴展性較好,可以擴展為大規模集群;

缺點:

數據一致性仍然依賴於原生的mysql半同步複製;

引入zk,整個系統的邏輯變得更加複雜;

2.4. 共享存儲

共享存儲實現了資料庫伺服器和存儲設備的解耦,不同資料庫之間的數據同步不再依賴於MySQL的原生複製功能,而是通過磁碟數據同步的手段,來保證數據的一致性。

2.4.1. SAN共享儲存

SAN的概念是允許存儲設備和處理器(伺服器)之間建立直接的高速網路(與LAN相比)連接,通過這種連接實現數據的集中式存儲。常用架構如下:

使用共享存儲時,MySQL伺服器能夠正常掛載文件系統並操作,如果主庫發生宕機,備庫可以掛載相同的文件系統,保證主庫和備庫使用相同的數據。

優點:

兩節點即可,部署簡單,切換邏輯簡單;

很好的保證數據的強一致性;

不會因為MySQL的邏輯錯誤發生數據不一致的情況;

缺點:

需要考慮共享存儲的高可用;

價格昂貴;

2.4.2. DRBD磁碟複製

DRBD是一種基於軟體、基於網路的塊複製存儲解決方案,主要用於對伺服器之間的磁碟、分區、邏輯卷等進行數據鏡像,當用戶將數據寫入本地磁碟時,還會將數據發送到網路中另一台主機的磁碟上,這樣的本地主機(主節點)與遠程主機(備節點)的數據就可以保證實時同步。常用架構如下:

當本地主機出現問題,遠程主機上還保留著一份相同的數據,可以繼續使用,保證了數據的安全。

DRBD是linux內核模塊實現的快級別的同步複製技術,可以與SAN達到相同的共享存儲效果。

優點:

兩節點即可,部署簡單,切換邏輯簡單;

相比於SAN儲存網路,價格低廉;

保證數據的強一致性;

缺點:

對io性能影響較大;

從庫不提供讀操作;

2.5. 分散式協議

分散式協議可以很好解決數據一致性問題。比較常見的方案如下:

2.5.1. MySQL cluster

MySQL cluster是官方集群的部署方案,通過使用NDB存儲引擎實時備份冗餘數據,實現資料庫的高可用性和數據一致性。

優點:

全部使用官方組件,不依賴於第三方軟體;

可以實現數據的強一致性;

缺點:

國內使用的較少;

配置較複雜,需要使用NDB儲存引擎,與MySQL常規引擎存在一定差異;

至少三節點;

2.5.2. Galera

基於Galera的MySQL高可用集群, 是多主數據同步的MySQL集群解決方案,使用簡單,沒有單點故障,可用性高。常見架構如下:

優點:

多主寫入,無延遲複製,能保證數據強一致性;

有成熟的社區,有互聯網公司在大規模的使用;

自動故障轉移,自動添加、剔除節點;

缺點:

需要為原生MySQL節點打wsrep補丁

只支持innodb儲存引擎

至少三節點;

2.5.3. POAXS

Paxos 演算法解決的問題是一個分散式系統如何就某個值(決議)達成一致。這個演算法被認為是同類演算法中最有效的。Paxos與MySQL相結合可以實現在分散式的MySQL數據的強一致性。常見架構如下:

優點:

多主寫入,無延遲複製,能保證數據強一致性;

有成熟理論基礎;

自動故障轉移,自動添加、剔除節點;

缺點:

只支持innodb儲存引擎

至少三節點;

3. 總結

隨著人們對數據一致性的要求不斷的提高,越來越多的方法被嘗試用來解決分散式數據一致性的問題,如MySQL自身的優化、MySQL集群架構的優化、Paxos、Raft、2PC演算法的引入等等。

而使用分散式演算法用來解決MySQL資料庫數據一致性的問題的方法,也越來越被人們所接受,一系列成熟的產品如PhxSQL、MariaDB Galera Cluster、Percona XtraDB Cluster等越來越多的被大規模使用。

隨著官方MySQL Group Replication的GA,使用分散式協議來解決數據一致性問題已經成為了主流的方向。期望越來越多優秀的解決方案被提出,MySQL高可用問題可以被更好的解決。

怎樣在Linux環境下安裝部署MySQL資料庫系統

在Linux安裝軟體需要預先做好如下一些準備:準備好Linux操作系統如:CentOS7。配置好yum源。

完成上述準備後,就可以動手安裝MySQL資料庫了。主要安裝步驟如下:

1. 禁用selinux

setenforce 0

2. 上傳安裝文件到Linux

3.解壓rpm包

tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar

4.安裝軟體

yum install mysql-community-{libs,client,common,server}-*.rpm

5.啟動mysql資料庫初始化

systemctl start mysqld

6.修改vi /etc/my.cnf

添加:

[mysqld]

#可以在表中錄入中文

character-set-server=utf8 #

explicit-defaults-for-timestamp

# 禁用當前密碼認證策略,可以使用簡單密碼(生產環境不適用)

validate_password=0

7.重啟mysql服務

systemctl restart mysqld

8.找臨時登錄密碼

grep -i “temporary password” /var/log/mysqld.log

9.連接MySQL資料庫

mysql -uroot -p 輸入臨時密碼

10.修改root用戶登錄密碼為簡單密碼(生產環境不適用)

alter user root@localhost identified by ”;

11.配置MYSQL_PS1環境變數

修改家目錄下:.bash_profile文件,添加

export MYSQL_PS1=”\u@\h[\d]”

12.使新環境變數生效

source /root/.bash_profile

13.重新連接mysql驗證

mysql -uroot -p

除了上述安裝方式以外,可能在公司中會遇到安裝指定版本的需求,那麼如何安裝指定版本的MySQL數據呢?這時我們可以採用下載指定版本安裝包進行安裝的方式,主要步驟如下,假設CentOS7 linux最小安裝,已經配置好yum。首先檢查是否安裝numactl包

rpm -qa|grep numactl

yum install numactl-libs-* # 如果沒有安裝需要安裝。檢查是否安裝libaio包

rpm -qa|grep libaio

yum install libaio-* # 如果沒有安裝需要安裝

具體安裝步驟如下:

* 禁用selinux

setenforce 0

* 上傳安裝文件到Linux

mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz

* 創建mysql用戶組和用戶

groupadd -g 27 -r mysql

#-r創建系統賬戶,-M 不創建用戶家目錄 -N 不創建和用戶名一樣的用戶組

useradd -M -N -g mysql -r -s /bin/false -c “MySQL Server” -u 27 mysql

id mysql

* 上傳安裝包到root家目錄

* 解壓二進位文件到/usr/local

tar -zxvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz -C /usr/local

* 解壓目錄改名為mysql

cd /usr/local

ls -l

mv mysql-5.7.26-linux-glibc2.12-x86_64/ mysql

* 環境變數中添加mysql/bin目錄

vi /root/.bash_profile

修改PATH=/usr/local/mysql/bin:$PATH:$HOME/bin

添加 export MYSQL_PS1=”\u@\h[\d]”

source /root/.bash_profile

* 創建/usr/local/mysql/etc/my.cnf選項文件 (也可以使用默認的/etc/my.cnf選項文件)

mkdir -p /usr/local/mysql/etc

mkdir -p /usr/local/mysql/mysql-files

* 編輯選項文件my.cnf填寫默認選項

vi /usr/local/mysql/etc/my.cnf

[mysqld]

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data

socket=/usr/local/mysql/data/mysql.sock

log-error=/usr/local/mysql/data/mysqld.err

pid-file=/usr/local/mysql/data/mysqld.pid

secure_file_priv=/usr/local/mysql/mysql-files

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

Explicit-defaults-for-timestamp

character-set-server=utf8

[mysql]

socket=/usr/local/mysql/data/mysql.sock

* 初始化數據目錄

cd /usr/local/mysql

mkdir data

chmod 750 data

chown mysql:mysql data

* 初始化資料庫

cd /usr/local/mysql

bin/mysqld –defaults-file=/usr/local/mysql/etc/my.cnf –initialize

* 使用systemd管理mysql

例如:systemctl {start|stop|restart|status} mysqld

cd /usr/lib/systemd/system

touch mysqld.service

chmod 644 mysqld.service

vi mysqld.service

# 添加以下內容

[Unit]

Description=MySQL Server

Documentation=man:mysqld(7)

Documentation=

After=network.target

After=syslog.target

[Install]

WantedBy=multi-user.target

[Service]

User=mysql

Group=mysql

Type=forking

PIDFile=/usr/local/mysql/data/mysqld.pid

# Disable service start and stop timeout logic of systemd for mysqld service.

TimeoutSec=0

# Start main service

ExecStart=/usr/local/mysql/bin/mysqld –defaults-file=/usr/local/mysql/etc/my.cnf –daemonize –pid-file=/usr/local/mysql/data/mysqld.pid $MYSQLD_OPTS

# Use this to switch malloc implementation

EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit

LimitNOFILE = 65535

Restart=on-failure

RestartPreventExitStatus=1

PrivateTmp=false

以上內容中注意:The –pid-file option specified in the my.cnf configuration file is ignored by systemd.

默認:LimitNOFILE = 5000,如果連接數(max_connection)需要調大,可以將LimitNOFILE 設置為最大65535

* 創建mysql.conf文件

cd /usr/lib/tmpfiles.d

#Add a configuration file for the systemd tmpfiles feature. The file is named mysql.conf and is placed in /usr/lib/tmpfiles.d.

cd /usr/lib/tmpfiles.d

touch mysql.conf

chmod 644 mysql.conf

* mysql.conf添加內容

vi mysql.conf

添加以下語句:

d /usr/local/mysql/data 0750 mysql mysql –

* 使新添加的mysqld服務開機啟動

systemctl enable mysqld.service

* 手動啟動mysqld

systemctl start mysqld

systemctl status mysqld

* 獲得mysql臨時登錄密碼

cat /usr/local/mysql/data/mysqld.err | grep “temporary password”

* 客戶端登錄連接mysql伺服器

mysql -uroot -p

輸入臨時密碼

* 修改MySQL用戶root@localhost密碼

mysql alter user root@localhost identified by ”; #此處為了方便設置為空密碼

* 測試新密碼連接MySQL服務

mysql -uroot -p

至此,我們就完成了在Linux環境下安裝MySQL的任務。通過這兩種方式我們可以體會到在Linux環境下安裝軟體的基本思路及方法。

Litedb如何部署到伺服器

1.安裝mysql資料庫的ODBC驅動,mysql-connector-odbc-3.51.23-win32.msi(其中*是版本號),下載並安裝。

2.在Mysql中創建資料庫實例。

3.打開控制面板 — 管理工具 — 數據源ODBC,在用戶DSN中添加一個MySQL ODBC 3.51數據源。

4.在登錄login選項卡中輸入數據源名稱Data Source Name,此處輸入MysqlDNS(也可以自己隨便命名,只要在後面導入數據的時候選擇正確的數據源名字就行);然後輸入伺服器Server,用戶User,密碼Password,輸入正確後選擇要導入的資料庫,Database選擇你需要導入的資料庫。在連接選項connect options中根據需要設置MySql使用的埠port和字符集Character Set。註:字符集一定要和Mysql伺服器相對應,如果Mysql使用了gbk字符集,則一定要設置字符集為gbk,否則導入到Sql Server可能會出現問號亂碼。

5.打開sql server企業管理器,選擇該資料庫,單擊右鍵選擇所有任務 — 導出數據。

6.『選擇數據源』為默認,『選擇目的』為剛剛安裝的mySQL數據源,用戶/系統DSN為MysqlDNS。方法2:有多種方法啊。介紹其中一種,使用mysql資料庫的ODBC驅動。步驟:1.安裝mysql資料庫的ODBC驅動,mysql-connector-odbc-3.51.23-win32.msi(其中*是版本號),下載並安裝。2.在Mysql中創建資料庫實例。3.打開控制面板 — 管理工具 — 數據源ODBC,在用戶DSN中添加一個MySQL ODBC 3.51數據源。4.在登錄login選項卡中輸入數據源名稱Data Source Name,此處輸入MysqlDNS(也可以自己隨便命名,只要在後面導入數據的時候選擇正確的數據源名字就行);然後輸入伺服器Server,用戶User,密碼Password,輸入正確後選擇要導入的資料庫,Database選擇你需要導入的資料庫。在連接選項connect options中根據需要設置MySql使用的埠port和字符集Character Set。註:字符集一定要和Mysql伺服器相對應,如果Mysql使用了gbk字符集,則一定要設置字符集為gbk,否則導入到Sql Server可能會出現問號亂碼。5.打開sql server企業管理器,選擇該資料庫,單擊右鍵選擇所有任務 — 導出數據。6.『選擇數據源』為默認,『選擇目的』為剛剛安裝的mySQL數據源,用戶/系統DSN為MysqlDNS。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/293147.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-25 18:39
下一篇 2024-12-25 18:39

相關推薦

  • 如何修改mysql的埠號

    本文將介紹如何修改mysql的埠號,方便開發者根據實際需求配置對應埠號。 一、為什麼需要修改mysql埠號 默認情況下,mysql使用的埠號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python 常用資料庫有哪些?

    在Python編程中,資料庫是不可或缺的一部分。隨著互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的資料庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • openeuler安裝資料庫方案

    本文將介紹在openeuler操作系統中安裝資料庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟體源 sudo…

    編程 2025-04-29
  • 伺服器安裝Python的完整指南

    本文將為您提供伺服器安裝Python的完整指南。無論您是一位新手還是經驗豐富的開發者,您都可以通過本文輕鬆地完成Python的安裝過程。以下是本文的具體內容: 一、下載Python…

    編程 2025-04-29
  • STUN 伺服器

    STUN 伺服器是一個網路伺服器,可以協助網路設備(例如 VoIP 設備)解決 NAT 穿透、防火牆等問題,使得設備可以正常地進行數據傳輸。本文將從多個方面對 STUN 伺服器做詳…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL資料庫 在使用Python操作MySQL之前,我們需要先連接MySQL資料庫。在Python中,我…

    編程 2025-04-29
  • 解決docker-compose 容器時間和伺服器時間不同步問題

    docker-compose是一種工具,能夠讓您使用YAML文件來定義和運行多個容器。然而,有時候容器的時間與伺服器時間不同步,導致一些不必要的錯誤和麻煩。以下是解決方法的詳細介紹…

    編程 2025-04-29
  • 資料庫第三範式會有刪除插入異常

    如果沒有正確設計資料庫,第三範式可能導致刪除和插入異常。以下是詳細解釋: 一、什麼是第三範式和範式理論? 範式理論是關係資料庫中的一個規範化過程。第三範式是範式理論中的一種常見形式…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • leveldb和unqlite:兩個高性能的資料庫存儲引擎

    本文將介紹兩款高性能的資料庫存儲引擎:leveldb和unqlite,並從多個方面對它們進行詳細的闡述。 一、leveldb:輕量級的鍵值存儲引擎 1、leveldb概述: lev…

    編程 2025-04-28

發表回復

登錄後才能評論