Linux

Linux服務php

[TOC]html

 

# mysql前端

**關係型數據庫**java

關係:就是一個一個的二維表 其中:表中的行,列次序並不重要node

行(record): 表中的每一行,又稱爲一條記錄python

列(column):表中的每一列,稱爲屬性,字段mysql

主鍵(primary key):是一個屬性,特性 用於肯定一個記錄的字段沒有重複 主鍵在一張表中只有一個主鍵 但能夠關聯到多個字段 如圖所示 兩列合起來惟一便可 這叫複合主鍵linux

- - 主鍵能夠避免出現冗餘數據nginx

域(domain): 屬性的取值範圍,如:性別只能是 男 和 女兩個值c++

惟一鍵; 一張表上能夠有好幾個惟一鍵 容許爲空

外鍵

 

 

 

增刪改查 insert delete update select

 

 

### SQL概念

是結構化查詢語言

​ SQL解釋器: 數據存儲協議: 應用層協議,c/s

S:server 監聽於套尖子,接受並處理客戶端的應用請求

C:client

​ 客戶端程序接口: CLI(字符界面的) CUI(圖形界面的)

​ 應用編程接口:ODBC JDBC

關係運算:

- 選擇: 挑選出符合條件的行
- 投影: 挑選出須要的字段
- 鏈接: 表間字段的關聯

 

**數據抽象:**

- 物理層: 數據存儲格式,即
- 邏輯層:DBA角度,描述存儲什麼數據,以及數據間存在什麼樣的關係
- 視圖層:用戶角度,描述DB中的部分數據

關係模型的分類:

- 關係模型
- 基於對象的關係模型
- 半結構化的

mysql官方文檔地址 [mariadb.com](http://mariadb.com/)

 

 

MYSQL特性 端口號是3306

- 插件是存儲引擎:也稱爲"表類型" mysql5.5.5版本開始的默認存儲引擎是innoDB 以前的版本是myisam
- 單進程 多線程
- 諸多擴展和新特性
- 注意有本身獨立的用戶 默認只有一個root用戶 注意這不是Linux的帳戶

安裝mysql

- Mariadb安裝方式

- - 源代碼:編譯安裝
- 二進制格式的程序包:展開至特定路徑,並通過簡單配置後便可使用
- 安裝包 yum

- 注意6上的mysql的配置文件在(同時充當服務器端和客戶端的配置文件) /etc/my.conf

- - service mysqld start 啓動mysql
- /var/lib/mysql 是
- 登錄帳戶 mysql -u(指定以誰的身份鏈接 默認不輸入是root) -p(後面跟口令)

- 7上安裝yum install

- - .var/lib/mysql 是存放

 

 

#### 安全加固:

運行此腳本 mysql_secure_installation mysql安全腳本

 

 

鏈接至遠程mysql服務器

 

 

 

**客戶端程序:**

- mysql 交互式工具
- mysqldump 備份工具

 

 

**用戶帳號:**

- 兩部分組成 用戶名和容許登錄的主機名 username@主機名
- 注意 支持通配符寫法 但由%代替* %匹配任意長度的任意字符 _ 匹配任意單個字符
-

 

**mysql****客戶端** mysql的腳本後綴通常寫成 .sql

使用模式:

交互式模式:

- 可運行命令有兩類

- - 客戶端命令 命令結尾能夠不加 ;

- - \h, help

- 服務器端命令 命令結尾必須加 ;

非交互式模式 mysql -e '命令'

 

 

#### mysql客戶端可用選項:

- -A, --no-auto-rehash 禁止補全
- **-u, --user=** **用戶名,****默認爲root**
- **-h, --host=** **服務器主機,****默認爲localhost**
- **-p, --passowrd=** **用戶密碼,****建議使用-p,****默認爲空密碼**
- **-P, --port=** **服務器端口**
- -S, --socket= 指定鏈接socket文件路徑
- -D, --database= 指定默認數據庫
- -C, --compress 啓用壓縮
- **-e** **「SQL****「** **執行SQL****命令**
- -V, --version 顯示版本
- -v --verbose 顯示詳細信息
- --print-defaults 獲取程序默認使用的配置

 

### Mairadb配置

vim /etc/my.cnf

datadir=數據庫數據存放路徑

 

 

partprobe 同步一下

pvcreate /dev/sda6

vgcreate vg0 /devsda6

lvcreate vg0 /dev/sda6

lvcreate -n mysql -l 100%FREE vg0

lvdisplay

建立文件系統

- mkfs.xfs /dev/vg0/mesql
- blkid

掛載

- mkdir /data/mysql
- mount /dev/vg0/mysql /data/mysql

遷移數據

- vim /etc/my.cnf
- 將datadir=後面的路徑更改成本身剛剛改的

 

 

 

#### 配置文件:

後面覆蓋前面的配置文件,下面的優先級更高順序以下

- /etc/my.cnf Global選項
- /etc/mysql/my.cnf Global選項
- SYSCONFDIR/my.cnf Global選項
- $MYSQL_HOME/my.cnf Server-specific 選項
- --defaults-extra-file=path
- ~/.my.cnf User-specific 選項

 

 

 

 

#### 通用二進制格式安裝過程 以mysql10.2.19版本爲例

1. 拷貝mariadb

2. 解包至指定文件夾 tar xf mar -C /usr/local

3. 進到此目錄

4. 1. ​

5. 建立軟鏈接 /usr/local/mysql

6. 1. ​

7. chown -R root.root /usr/local/mysql 修正全部者所屬組,由於此時的所屬組與所屬者是不存在的

8. 此時沒有數據庫的用戶帳號

9. 1. 建立 useradd -r -s /sbin/nologin -d /data/mysql -c'描述' mysql

10. 存放數據庫的文件的目錄如今不存在

11. 1. 建立:mkdir /data/mysql或者
2. 建立文件夾並將全部者所屬組等屬性一次性設置好install -d /data/mysql -o 全部者 -g 所屬組

12. 進到此目錄 cd /usr/local/mysql

13. 建立

14. 1. ​

15. 準備mysql的配置文件

16. 1. mkdir /etc/mysql

2. cp support-files/my-large.cnf /etc/mysql/my.cnf

3. vim 剛拷過來的文件 在[mysqld]下面添加選項

4. 1. datadir=/data/mysql
2. 將socket的路徑改成/data/mysql/mysql.sock[注意是兩處socket]
3. ​

17. 將服務腳本拷貝 cp support-files/mysql.server /etx/init.d/ 並更名爲mysqld 不改也能夠

18. 執行chkconfig --add mysqld

19. 完成 啓動

20. echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh

21. . /etc/profile.d/mysqld

22. 1. ​

23. 更改執行安全的腳本的socket路徑 mysql_secure_installation

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#### 源碼編譯安裝mariadb

- 安裝包:yum install bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel gcc gcc-c++ cmake ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel

- 作準備用戶和數據目錄

- - useradd –r –s /sbin/nologin –d /data/mysql/ mysql 建立用戶
- mkdir /data/mysql 建立目錄

chown mysql.mysql /data/mysql

tar xvf mariadb-10.2.18.tar.gz 解壓縮

 

- cmake編譯安裝

cd mariadb-10.2.18/

cmake . \

-DCMAKE_INSTALL_PREFIX=/app/mysql \

-DMYSQL_DATADIR=/data/mysql/ \

-DSYSCONFDIR=/etc \

-DMYSQL_USER=mysql \

-DWITH_INNOBASE_STORAGE_ENGINE=1 \

-DWITH_ARCHIVE_STORAGE_ENGINE=1 \

-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \

-DWITH_PARTITION_STORAGE_ENGINE=1 \

-DWITHOUT_MROONGA_STORAGE_ENGINE=1 \

-DWITH_DEBUG=0 \

-DWITH_READLINE=1 \

-DWITH_SSL=system \

-DWITH_ZLIB=system \

-DWITH_LIBWRAP=0 \

-DENABLED_LOCAL_INFILE=1 \

-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \

-DDEFAULT_CHARSET=utf8 \

-DDEFAULT_COLLATION=utf8_general_ci

make -j

make install

- 提示:若是出錯,執行rm -f CMakeCache.txt

 

cd /app/mysql

scripts/my

- 準備環境變量

echo 'PATH=/app/mysql/bin:$PATH' > /etc/profile.d/mysql.sh

. /etc/profile.d/mysql.sh

- 生成數據庫文件

cd /app/mysql/

scripts/mysql_install_db --datadir=/data/mysql/ --user=mysql

- 準備配置文件

cp /app/mysql/support-files/my-huge.cnf /etc/my.cnf

- 準備啓動腳本

cp /app/mysql/support-files/mysql.server /etc/init.d/mysqld

- 加載啓動服務腳本

chkconfig --add mysqld ;service mysqld start

- 執行安全腳本

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


#### 實現mysql多實例: 基於源碼編譯的

- 多實例是一個軟件運行好幾個 有多個進程 每一個實例在運行的時候互相之間是絕不相干的

- 在測試環境中使用

- 各個實例有各自的數據庫目錄 查看數據庫目錄

- - ​

-

 

搭載步驟: 此處是同一個程序開三個實例

1. 創建三個目錄

mkdir /mysql/{3306,3307,3308} -pv

1. 創建目錄存放各自的配置 此步驟不作也能夠mkdir {3306,3307,3308}/{data,etc,socket,log,pid,log}

2. 更改全部者 chown -R mysql.mysql *

3. 生成數據庫數據文件 用mysql自帶的程序生成 重複操做/app/mysql/scripts/mysql_install_db --user=mysql --satadir=/mysql/3306/

4. 1. 進到/app/mysql/執行

\2. ./scripts/mysql_install_db --user=mysql --datadir=/mysql/3306/data

\3. 重複執行3307和3308

1. 準備配置文件 複製配置文件 到各自個實例下面 並更改 cp /app/mysql/etc/my.cnf /mysql3306

\1. 這另外一種方法 可以簡單快速完成 將另外一臺用rpm安裝的最新版的mysql的配置文件拷貝過來並進行修改

\1. vim /mysql/3306/etc/my.cnf datadir=是數據庫文件的存放路徑

\2.

 

1. 準備服務啓動腳本 每一個實例應該有各自的啓動腳本

2. 1. 修改啓動腳本 需注意每一個實例都有各自的端口號

2. 1. ​
2. cmd_path=是二進制路徑

3. 將此文件拷貝至3307,3308的實例文件中 並更改端口號

4. 1. 賦予權限chmod +x /mysql/3306/mysqld

5. 運行安全腳本爲當前實例加口令:

6. 1. 運行安全腳本方式 注意必定要指明路徑在/app/mysql/ 下執行 ./scripts/mysql_instal_db –user=mysql –datadir=路徑(數據庫文件的存放路徑)

2. 1. 注意不要在存放數據庫文件的目錄下存放隱藏文件

3. 下圖是給3308實例運行安全腳本

4. ​

7. 啓動程序./mysqld start ss -ntl查看端口號

8. 連接時要指明端口號 :鏈接mysql多實例

9. 1. mysql –uroot –p –S /mysql/3308/socket/mysql.sock
2. **或**mysql –uroot –h127.0.0.1(IP地址) –p 3308

10. 中止一個實例3308爲例

11. 1. 進入到3308的目錄下 執行 ./mysqld stop

12. 能夠將各自示例的啓動服務拷貝至init.d下 下面示範的是3308 需在3308目錄下執行

13. 1. cp mysqld /etc/init.d/mysqld3308

2. 執行完後則能夠用service 命令控制啓動中止

3. 執行完後就是一個服務腳本了能夠設置爲開機啓動 能夠在啓動腳本內添加

4. 1. ​

14. 建立用戶:建立用戶不要讓他自動生成數據庫家目錄不然會自動拷貝配置文件要用mkdir手動建立

15. 1. useradd mysql –r –d /data/mysql

 

專門實現多實例的程序 但有侷限性,適合於電腦上只有一個mysql版本mysqld_multi

​ 只能實現一個版本

 

 

 

 

 

 

 

 

 

 

 

 

 

## 數據庫操做:

數據庫說白了是文件夾 真正存數據的是文件 文件對應的是表

**mysqld_multi**

· 查看數據庫文件列表的命令: 查看數據庫列表:show databases;

· information_schema是個特殊的數據庫 在內存中

#### 用戶的數據庫建立

l create database|schema [if ont exists] db_name

o database和schema都是建立數據庫選一個就好

o [if ]目標不存在則建立,目標存在則不建立

o [db_name]數據庫名字

· 查看數據庫 show databases

· 建立數據庫:create database testdb

· 指定字符集:character set =‘字符集名稱’例如: create database db_name CHARACTER SET=utf8mb;

o 修改字符集:alter table student CHARACTER SET =utf8mb4;

o 設定整個服務器全部是使用的字符集:vim /etc/my.cnf

o

o 而後修改客戶端配置文件 vim /etc/my.cnf.d/mysql-clients.cnf 也能夠寫入到my.cnf中 但寫到此處更有條理

o

· 指定排序規則:collate ‘collate name’

l 刪除數據庫: drop database|schema [if exists] ‘db_name’

l 查看本機支持的全部字符集: show collation;

l 查看數據庫列表mysql > show databases

l 字符集:

n 查看數據庫用的什麼字符集: cat /var/lib/mysql/db_name/db.opt

u 第一排是字符集 第二排是排序規則

u

n shou create database db_name

 

 

 

#### 數據庫的表

 

###### 建立表

表示真正存數據的

l 建立表: 幫助:help create table;

n 語法: create table [if not esists] ‘tbl_name’ (列的名稱 類型 修飾符,列的名稱2 類型2 修飾符,…)

u 舉例:create table

n create [temporary] table [if not esists] tbl_name (create_definition…)

u [temporary] 臨時表 是可選項

u [if not esists] 若是存在則不建立

u tbl_name表名稱

u (create_definition…) 建立表時的定義

n 第二種建立表的方式: 將輸出內容做爲表的此表的內容 create table 新表 select * from 舊錶;

n 第三種建立表的方式: 複製表結構:create table custom like 舊錶; 注意此方法如跨庫使用則標明

u 如:carete table 新表名稱 like 庫名稱.表名稱

l 字段的名稱 字段的數據類型 修飾符

n 修飾符:NULL 數據列可包含空值(默認的能夠不寫) NOT NULL DEFAULT默認值 PRIMARY KRY主鍵 UNIQUE KEY 惟一鍵 CHARACTER SET name 指定一個字符集(注意這是給字段單獨指定一個字符集 最好別用)

u 數值型: AUTO_INCREMENT 自動遞增,適用於整數類型 只適用於數字 UNSIGEND 無符號

n 數據類型:分爲三大類 數值型(分爲整數型和小數型) 字符型 時間\日期型

n

u 整數型: tinyint(m) 1個字節 範圍(-128~127) smallint(m) 2個字節 範圍(-32768~32767) mediumint(m) 3個字節 範圍(-8388608~8388607) int(m) 4個字節 範圍(-2147483648~2147483647) bigint(m) 8個字節 範圍(+-9.22*10的18次方)

l 加了unsigned,則最大值翻倍,如:tinyint unsigned的取值範圍爲(0~255) int(m)裏的m是表示SELECT查詢結果集中的顯示寬度,並不影響實際的取值範圍

n 舉例:建立一個存放學員信息的數據庫和表:

\1. create database studentdb; 建立數據庫

\2. use stubentdb;使用這個數據庫

\3. create table student (id int unsigned auto_increment primary, name varchar (10), sex enum(‘f’,’m’) default ‘m’, phone char(11), address varchar(50))

l id,name,sex,phone,address 是字段名稱

l unsigned 是隻容許爲整數 auto_increment是數值自動排序 primary添加主鍵(主鍵默認不容許爲空) enum 是眉舉 只能在特定的字符或字符串中選一個 default ’m’ 默認是m

l 建立完成以後查看錶結構:desc student; 和show columns from stundent; student是表名稱

###### 表操做

 

 

n 注意:在老版本的數據庫中,沒有ibd文件(存放表的數據的位置) 而是將全部庫的全部表的數據都放在了/var/lib/mysql/ibdata1文件中 但能夠設置爲有ibd文件

u 能夠經過此命令查看是否開啓ON是開啓show variables like ‘%per_table%’;

u 能夠在配置文件內加一行 innodb_file_per_table=ON

n 若是查看錶時現實的太亂可在其結尾加上\G

n 查看全部的引擎:SHOW ENGINES

n 查看錶:SHOW TABLES [FROM db_name]

n 查看錶結構:DESC [db_name.]tb_name

u SHOW COLUMNS FROM [db_name.]tb_name

n 刪除表:DROP TABLE [IF EXISTS] tb_name

n 查看錶建立命令:SHOW CREATE TABLE tbl_name

n 查看錶狀態:SHOW TABLE STATUS LIKE 'tbl_name’

n 查看庫中全部表狀態:SHOW TABLE STATUS FROM db_name

n 查看當初是怎麼定義表的: show create table 表名稱;

 

 

l 表表現爲橫行縱列

n 列稱爲字段:字段名,字段數據類型(好比:數字,字符串,整數,小數),修飾符(是約束,限定.例如:是否容許字段爲空)

u 數據類型

u 決定了此字段在磁盤上保存上佔的空間多大

u

n 行稱爲記錄

 

l DROP TABLE [IF EXISTS] 'tbl_name';

l ALTER TABLE 'tbl_name'

n 字段:

u 添加字段:add

u ADD col1 data_type [FIRST|AFTER col_name] first是將新添加的字段設爲整個表的第一個字段 AFTER col_name 是在特定的字段後面添加一個新字段

u 刪除字段:drop

u 修改字段:

u alter(默認值), change(字段名), modify(字段屬性)

n 索引:

u 添加索引:add index

u 刪除索引:drop index

n 表選項

u 修改:

l 查看錶上的索引:SHOW INDEXES FROM [db_name.]tbl_name;

l 查看幫助:Help ALTER TABLE

l 通表結構能修改但不多去修改

 

 

 

###### 數據類型

 

[點這裏查看詳細的](#數據類型)

l 數據類型:數據類型:數據類型:

n 數據長什麼樣

n 數據須要多少空間來存放

l 系統內置數據類型和用戶定義數據類型

l MySql支持多種列類型:

n 數值類型

n 日期/時間類型

n 字符串(字符)類型

n https://dev.mysql.com/doc/refman/5.5/en/data-types.html

l 選擇正確的數據類型對於得到高性能相當重要,三大原則:

n 更小的一般更好,儘可能使用可正確存儲數據的最小數據類型

n 簡單就好,簡單數據類型的操做一般須要更少的CPU週期

n 儘可能避免NULL,包含爲NULL的列,對MySQL更難優化

 

**1、** **整型**

a) tinyint(m) 1個字節 範圍(-128~127)

b) smallint(m) 2個字節 範圍(-32768~32767)

c) mediumint(m) 3個字節 範圍(-8388608~8388607)

d) int(m) 4個字節 範圍(-2147483648~2147483647)

e) bigint(m) 8個字節 範圍(+-9.22*10的18次方)

f) 加了unsigned,則最大值翻倍,如:tinyint unsigned的取值範圍爲(0~255)int(m)裏的m是表示SELECT查詢結果集中的顯示寬度,並不影響實際的取值範圍,規定了MySQL的一些交互工具(例如MySQL命令行客戶端)用來顯示字符的個數。對於存儲和計算來講,Int(1)和Int(20)是相同的

g) BOOL,BOOLEAN:布爾型,是TINYINT(1)的同義詞。zero值被視爲假,非zero值視爲真

**2、** **浮點型(float****和double)****,近似值**

a) float(m,d) 單精度浮點型 8位精度(4字節) m總個數,d小數位

b) double(m,d) 雙精度浮點型16位精度(8字節) m總個數,d小數位

c) 設一個字段定義爲float(6,3),若是插入一個數123.45678,實際數據庫裏存的是123.457,但總個數還以實際爲準,即6位

**3、** **定點數**

a) 在數據庫中存放的是精確值,存爲十進制

b) decimal(m,d) 參數m<65 是總個數,d<30且 d<m 是小數位

c) MySQL5.0和更高版本將數字打包保存到一個二進制字符串中(每4個字節存9個數字)。例如,decimal(18,9)小數點兩邊將各存儲9個數字,一共使用9個字節:小數點前的數字用4個字節,小數點後的數字用4個字節,小數點自己佔1個字節

d) 浮點類型在存儲一樣範圍的值時,一般比decimal使用更少的空間。float使用4個字節存儲。double佔用8個字節

e) 由於須要額外的空間和計算開銷,因此應該儘可能只在對小數進行精確計算時才使用decimal——例如存儲財務數據。但在數據量比較大的時候,能夠考慮使用bigint代替decimal

4、 字符串(char,varchar,_text)

a) char(n) 固定長度,最多255個字符

b) varchar(n) 可變長度,最多65535個字符

c) tinytext 可變長度,最多255個字符

d) text 可變長度,最多65535個字符

e) mediumtext 可變長度,最多2的24次方-1個字符

f) longtext 可變長度,最多2的32次方-1個字符

g) BINARY(M) 固定長度,可存二進制或字符,長度爲0-M字節

h) VARBINARY(M) 可變長度,可存二進制或字符,容許長度爲0-M字節

i) 內建類型:ENUM枚舉, SET集合

**5、** **char****和varchar****:**

a) char(n) 若存入字符數小於n,則以空格補於其後,查詢之時再將空格去掉,因此char類型存儲的字符串末尾不能有空格,varchar不限於此

b) char(n) 固定長度,char(4)無論是存入幾個字符,都將佔用4個字節,varchar是存入的實際字符數+1個字節(n< n>255),因此varchar(4),存入3個字符將佔用4個字節

c) char類型的字符串檢索速度要比varchar類型的快

**6、** **varchar****和text****:**

a) varchar可指定n,text不能指定,內部存儲varchar是存入的實際字符數+1個字節(n< n>255),text是實際字符數+2個字節。

b) .text類型不能有默認值

c) varchar可直接建立索引,text建立索引要指定前多少個字符。varchar查詢速度快於text

**7、** **.****二進制數據:BLOB**

a) BLOB和text存儲方式不一樣,TEXT以文本方式存儲,英文存儲區分大小寫,而Blob是以二進制方式存儲,不分大小寫

b) BLOB存儲的數據只能總體讀出

c) TEXT能夠指定字符集,BLOB不用指定字符集

**8、** **日期時間類型**

a) date 日期 '2008-12-2'

b) time 時間 '12:25:36'

c) datetime 日期時間 '2008-12-2 22:06:44'

d) timestamp 自動存儲記錄修改時間

e) YEAR(2), YEAR(4):年份

f) timestamp字段裏的時間數據會隨其餘字段修改的時候自動刷新,這個數據類型的字段能夠存放這條記錄最後被修改的時間

**9、** **修飾符**

全部類型:

a) NULL 數據列可包含NULL值

b) NOT NULL 數據列不容許包含NULL值

c) DEFAULT 默認值

d) PRIMARY KEY 主鍵

e) UNIQUE KEY 惟一鍵

f) CHARACTER SET name 指定一個字符集

數值型

g) AUTO_INCREMENT 自動遞增,適用於整數類型

h) UNSIGNED 無符號

 

 

 

##### DML語句

l DML: insert,delete,uptate 增 刪 改

n insert: 增

u 一次插入一行或多行數據

u 語法:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)]

{VALUES | VALUE} ({expr | DEFAULT},...),(...),...

[ ON DUPLICATE KEY UPDATE 若是重複更新之

col_name=expr

[ , col_name=expr] ... ]

u 簡化寫法:

l INSERT tbl_name [(col1,...)] VALUES (val1,...), (val21,...)

u 舉例: 對記錄賦值

l insert student set name=’wang’ , age=18,address=’北京’; 此方法用的較少

l insert 新表 select * from 舊錶; 將舊錶的內容批量的添加到新表中. 注意 新表與舊錶格式必須相同

l insert into student (name,age,mobile,address) values (‘mage’ , 30 , 手機號, ‘北京’), (‘zhangsir’ ,28,手機號,’鄭州’) 值和字段的順序必須一一對應

l

 

 

n delete刪除

u 刪除數據庫:drop database

u 刪除表drop table

u 刪除表:truncate table student; 注意這個速度較快但不會記錄到日誌 很是危險

u 刪除表中記錄:delete from 表名稱 where 位置

l 例如:刪除id大於5的記錄 delete from student where id >= 5;

n update改

u update 表名稱 set name

 

 

 

**select****語句**

 

#### 日誌

##### 事務日誌

事務日誌默認存放位置是存放數據庫文件的路徑

 

vim /etc/my.cnf

在mysqld下輸入

 

事務日誌優化 innodb_flush_log_at_trx_commit 2性能最好 最經常使用 1最安全

說明:設置爲1,同時sync_binlog = 1表示最高級別的容錯 innodb_use_global_flush_log_at_trx_commit的值肯定是否能夠使用SET語句重置此變量

1默認狀況下,日誌緩衝區將寫入日誌文件,並在每次事務後執行刷新到磁盤。 這是徹底遵照ACID特性

0提交時沒有任何操做; 而是每秒執行一第二天志緩衝區寫入和刷新。 這樣能夠提供更好的性能,但服務器崩潰能夠清除最後一秒的事務

2每次提交後都會寫入日誌緩衝區,但每秒都會進行一次刷新。 性能比0略好一些,但操做系統或停電可能致使最後一秒的交易丟失

3模擬MariaDB 5.5組提交(每組提交3個同步),此項MariaDB 10.0支持

 

 

 

##### 錯誤日誌

錯誤日誌路徑log-error=

重啓服務也會記錄到錯誤日誌

 

##### 通用日誌

記錄對數據庫的通用操做,包括錯誤的sql語句

沒有性能負擔時不需啓用 是分析的

通用日誌相關設置

general_log=ON|OFF 是否啓用(默認是OFF) set goobal general_log=ON(臨時開啓)

general_log_file=HOSTNAME.log 通用日誌存放路徑

log_output=TABLE|FILE|NONE 將通用日誌存放在數據庫文件中

​ file是默認的,存放在文件內 table是存放爲數據庫文件

 

##### 慢查詢日誌

記錄什麼命令執行的時間過長

**slow_query_log=ON/OFF** **是否啓用**

默認的名稱是HOSTNAME-slow.log

show_query_log_filter=HOSTNAME-slow.log 慢查詢的日誌文件

**select @@long_query_time;** **查詢慢查詢的閾值** **單位是秒**

long_query_time=幾秒鐘 默認是十秒 須要更改成更小,十秒太長

**log_queries_not_using_indexes=ON** 不使用索引或使用全索引掃描,不管是否達到慢查詢閥值的語句是否記錄日誌,默認OFF,即不記錄 不利用索引即記入慢查詢日誌

log_slow_rate_limit = 1 多少次查詢才記錄,mariadb特有

log_slow_verbosity= Query_plan,explain 記錄內容

log_slow_queries = OFF 同slow_query_log 新版已廢棄

profiling=ON/OFF 是查詢慢查詢記錄慢在了哪裏

n show profiles;

n

n show profile fur query 5; 查詢第5條記錄

 

 

##### 二進制日誌

很是重要! 生產中要啓用,設置爲行格式

二進制特型:

1) 默認是不啓用的,但須要啓用 需按期清理

2) 利用二進制日誌能恢復數據的操做 mysql > 二進制日誌裏面的命令

3) 記錄整個數據庫的全部增刪改操做 不記錄讀操做 人爲不刪除會一直存在

4) 記錄已提交的日誌

5) 不依賴存儲引擎類型

6) 功能:經過 「重放」日誌文件中的事件來生成數據副本

注意:建議二進制日誌和數據文件分開存放默認是在一塊兒的 需分離

 

二進制記錄格式:

· 有三種記錄格式

o 基於「語句」記錄:statement ,記錄語句,默認模式

o 基於 「行」記錄:row ,記錄數據,日誌量較大 建議更改成此記錄格式

o 混合模式:mixed, 讓系統自行斷定該基於哪一種方式進行

· 格式配置

o show variables like ‘binlog_format’;

· 二進制日誌文件的構成

o 有兩類文件

§ 日誌文件:mysql|mariadb-bin.文件名後綴,二進制格式 如: mariadb-bin.000001 二進制日誌自己

§ 索引文件:mysql|mariadb-bin.index,文本格式

二進制日誌相關的服務器變量/選項:

o sql_log_bin=ON|OFF:是否記錄二進制日誌,默認ON 此項啓用並不表明真正啓用二進制日誌,需與下一項配合

o log_bin=/PATH/BIN_LOG_FILE:指定文件位置;默認OFF,表示不啓用二進制日誌功能,上述兩項都開啓纔可

§ 注意 寫進配置文件不能寫log_bin=ON此寫法表示的是指二進制文件名的前綴,應寫爲log-bin是默認,

§ 建議不只僅寫log_bin 應寫爲log_bin=/路徑/路徑/名稱前綴

§ set sql_log_bin=ON|OFF 臨時啓用二進制日誌 臨時禁用二進制日誌

o binlog_format=STATEMENT|ROW|MIXED:二進制日誌記錄的格式,默認STATEMENT 建議更改成行級別的:即ROW select

o set @@binlog_format 查看二進制日誌記錄格式

o max_binlog_size=1073741824:單個二進制日誌文件的最大致積,到達最大值會自動生成新的二進制日誌文件,默認爲1G 數據庫重啓也會生成新的二進制日誌文件 flush logs也能夠生成新的二進制日誌文件

§ 說明:文件達到上限時的大小未必爲指定的精確值

o sync_binlog=1|0:設定是否啓動二進制日誌即時同步磁盤功能,默認0,由操做系統負責同步日誌到磁盤,1表明只要有二進制日誌文件生成就會同步至磁盤 1安全 0高性能

o expire_logs_days=N:二進制日誌能夠自動刪除的天數。 默認爲0,即不自動刪除 單位是天數 時間最好設長一點

二進制日誌相關配置

o 查看mariadb自行管理使用中的二進制日誌文件列表,及大小

§ SHOW {BINARY | MASTER} LOGS

o 查看使用中的二進制日誌文件

§ SHOW MASTER STATUS

o 查看二進制文件中的指定內容

§ SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]

§ show binlog events in ‘mysql-bin.000001' from 6516 limit 2,3

§ from從哪開始看 limit 跳過幾個看幾個

· flush logs刷新二進制日誌文件 生成新的二進制日誌文件 切換二進制日誌文件

 

 

日誌

o mysqlbinlog:二進制日誌的客戶端命令工具 執行的命令默認是用base64編碼加密過 加-v可顯示

o 命令格式

§ mysqlbinlog [OPTIONS] log_file…

§ --start-position=# 指定開始位置

§ --stop-position=# 指定結束位置

§ --start-datetime= 指定開始時間

§ --stop-datetime= 指定結束時間 不寫便是從指定開始時間到最後的全部內容所有顯示

§ 時間格式:YYYY-MM-DD hh:mm:ss

§ --base64-output[=name]

§ -v -vvv

 

二進制日誌事件的格式

o # at 328

o #151105 16:31:40 server id 1 end_log_pos 431 Query thread_id=1 exec_time=0 error_code=0

o use `mydb`/*!*/;

o SET TIMESTAMP=1446712300/*!*/;

o CREATE TABLE tb1 (id int, name char(30))

o /*!*/;

o 事件發生的日期和時間:151105 16:31:40

o 事件發生的服務器標識:server id 1

o 事件的結束位置:end_log_pos 431

o 事件的類型:Query

o 事件發生時所在服務器執行此事件的線程的ID:thread_id=1

o 語句的時間戳與將其寫入二進制文件中的時間差:exec_time=0

o 錯誤代碼:error_code=0

o 事件內容:

o GTID:Global Transaction ID,mysql5.6以mariadb10以上版本專屬屬性:GTID

 

清除指定二進制日誌

注意清除二進制文件以前要作好備份

清除指定二進制文件

PURGE { BINARY | MASTER } LOGS

{ TO 'log_name' | BEFORE datetime_expr }

示例:

PURGE BINARY LOGS TO ‘mariadb-bin.000003’;刪除3以前的日誌

PURGE BINARY LOGS BEFORE '2017-01-23';

PURGE BINARY LOGS BEFORE '2017-03-22 09:25:30';

刪除全部二進制日誌,index文件從新記數

RESET MASTER [TO #]; 刪除全部二進制日誌文件,並從新生成日誌文件,文件名從#開始記數,默認從1開始,通常是master主機第一次啓動時執行,MariaDB10.1.6開始支持TO #

 

 

恢復數據庫2018-12-3 16:18:40

導出二進制日誌文件:

 

 

 

 

 

 

 

 

## 數據庫備份恢復

l 備份類型:

n 徹底備份,部分備份

u 徹底備份:整個數據集

u 部分備份:只備份數據子集,如部分庫或表

n 徹底備份、增量備份、差別備份

u 增量備份:僅備份最近一次徹底備份或增量備份(若是存在增量)以來變化的數據,備份較快,還原複雜

u 差別備份:僅備份最近一次徹底備份以來變化的數據,備份較慢,還原簡單

l 注意:二進制日誌文件不該該與數據文件放在同一磁盤

 

l 冷、溫、熱備份

n 冷備:讀寫操做均不可進行

n 溫備:讀操做可執行;但寫操做不可執行,需手動加鎖

n 熱備:讀寫操做都可執行

u MyISAM:溫備,不支持熱備

u InnoDB:都支持

l 物理和邏輯備份

n 物理備份:直接複製數據文件進行備份,與存儲引擎有關,佔用較多的空間,速度快

n 邏輯備份:從數據庫中「導出」數據另存而進行的備份,與存儲引擎無關,佔用空間少,速度慢,可能丟失精度

 

### 備份和恢復

備份工具

\1. cp, tar等複製歸檔工具:物理備份工具,適用全部存儲引擎;只支持冷備;徹底和部分備份

\2. LVM的快照:先加鎖,作快照後解鎖,幾乎熱備;藉助文件系統工具進行備份

a) 基於LVM的備份 不影響用戶訪問 但會影響用戶訪問的性能

b) (1) 請求鎖定全部表

​ i. mysql> FLUSH TABLES WITH READ LOCK;

c) (2) 記錄二進制日誌文件及事件位置

​ i. 1. mysql> FLUSH LOGS;

​ ii. 2. mysql> SHOW MASTER STATUS;

​ iii. 3. mysql -e 'SHOW MASTER STATUS' > /PATH/TO/SOMEFILE

d) (3) 建立快照

​ i. 1. lvcreate -L # -s -p r -n NAME /DEV/VG_NAME/LV_NAME

e) (4) 釋放鎖

​ i. 1. mysql> UNLOCK TABLES;

f) (5) 掛載快照卷,執行數據備份

g) (6) 備份完成後,刪除快照卷

h) (7) 制定好策略,經過原卷備份二進制日誌

\3. mysqldump:邏輯備份工具,適用全部存儲引擎,溫備;支持徹底或部分備份;對InnoDB存儲引擎支持熱備,結合binlog的增量備份

a) **邏輯備份工具:mysqldump,** mydumper, **phpMyAdmin(****這是web****界面的)**

b) Schema和數據存儲在一塊兒、巨大的SQL語句、單個巨大的備份文件

​ i. Schema

c) mysqldump工具:客戶端命令,經過mysql協議鏈接至mysql服務器進行備份

​ **i.** **注意此工具只是將數據庫內容打印到屏幕上,****需配合重定向來存儲** **並且還原時需手動建立數據庫,****由於此方法備份的數據會很是巨大,****需打包壓縮**

​ ii. mysqldump [OPTIONS] database [tables] **此語法不建議使用**(由於此命令不會備份數據庫結構)

1. database是數據庫名稱 此命令是備份整個數據庫

2. 注意:只能同時對一個數據庫進行備份

​ iii. mysqldump [OPTIONS] --database DB1 [DB2 DB3...]

1. 此命令是指定數據庫進行備份 DB是表明數據庫內的表的

2. --database能夠縮寫爲-B

3. 注意此方法不會備份函數,存儲過程,觸發器等

a) 舉例:用此方法備份數據庫 mysqldump –B備份數據庫

​ i.

​ ii.

b) 此方法是將備份與壓縮和併到一塊兒mysqldump –B hellp | xz > hello_bak.sql.xz

​ i. 注意hello_bak.sql是備份後的名稱 xz是備份方式

​ iv. mysqldump [OPTIONS] –A [OPTIONS]此方法是備份整個數據庫 此方法會同時備份mysql 生產中通常都用-A選項

1. –A是 --alldatabase的縮寫

2. 會將全部內容與設置所有保存 如函數.存儲過程,函數.觸發器等

​ v. mysqldump常見選項:

1. -A, --all-databases 備份全部數據庫,含create database

2. -B , --databases db_name… 指定備份的數據庫,包括create database語句

3. -E, --events:備份相關的全部event scheduler

4. -R, --routines:備份全部存儲過程和自定義函數

5. --triggers:備份表相關觸發器,默認啓用,用--skip-triggers,不備份觸發器

6. --default-character-set=utf8 指定字符集

7. --master-data[=#]****:** **此選項須啓用二進制日誌**

a) 1:所備份的數據以前加一條記錄爲CHANGE MASTER TO語句,非註釋,不指定#,默認爲1

b) 2:記錄爲註釋的CHANGE MASTER TO語句 CHANGE MASTER TO是命令主從複製的

c) 此選項會自動關閉--lock-tables功能,自動打開-x | --lock-all-tables功能(除非開啓--single-transaction)

d) -1是配合主從複製用的 如不須要可更改成2

8. **-F, --flush-logs** **:備份前滾動日誌**,鎖定表完成後,執行flush logs命令,生成新的二進制日誌文件,配合-A 或 -B 選項時,會致使刷新屢次數據庫。建議在同一時刻執行轉儲和日誌刷新,可經過和--single-transaction或-x,--master-data 一塊兒使用實現,此時只刷新一第二天志

9. --compact 去掉註釋,適合調試,生產不使用 不存儲註釋的內容

10. -d, --no-data 只備份表結構

11. -t, --no-create-info 只備份數據,不備份create table

12. -n,--no-create-db 不備份create database,可被-A或-B覆蓋

13. --flush-privileges 備份mysql或相關時須要使用

14. -f, --force 忽略SQL錯誤,繼續執行

15. --hex-blob 使用十六進制符號轉儲二進制列,當有包括BINARY, VARBINARY,BLOB,BIT的數據類型的列時使用,避免亂碼

16. -q, --quick 不緩存查詢,直接輸出,加快備份速度

d) mysqldump參考: <https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html>

\4. xtrabackup:由Percona提供支持對InnoDB作熱備(物理備份)的工具,支持徹底備份、增量備份

\5. MariaDB Backup: 從MariaDB 10.1.26開始集成,基於Percona XtraBackup 2.3.8實現

\6. mysqlbackup:熱備份, MySQL Enterprise Edition組件

\7. mysqlhotcopy:PERL 語言實現,幾乎冷備,僅適用於MyISAM存儲引擎,使用LOCK TABLES、FLUSH TABLES和cp或scp來快速備份數據庫

 

 

如何實現分庫備份:2018年12月5日10:53:44

for db in `mysql –e ‘show database’ | grep –Eiv ‘^(database|infomantion_schema|performance)$’`;do mysqldump –B $db |gzip > $db `date + %F` .sql.gz;done

或者mysql –e ‘show database’ |grep –EV ‘^(database|infomantion_schema|performance)$’|sed –r ‘s/(.*)/mysqldump –B \1 |gzip > \/data\/1.sql.gz/’ |bash

 

 

 

 

innodb和myisam的區別

 

 

**MyISAM****備份選項:**

l 支持溫備;不支持熱備,因此必須先鎖定要備份的庫,然後啓動備份操做

l 鎖定方法以下:

n -x,--lock-all-tables:加全局讀鎖,鎖定全部庫的全部表,同時加--single-transaction或--lock-tables選項會關閉此選項功能 強烈建議加-x MySAM推薦加-x

n 注意:數據量大時,可能會致使長時間沒法併發訪問數據庫

n -l,--lock-tables:對於須要備份的每一個數據庫,在啓動備份以前分別鎖定其全部表,默認爲on,--skip-lock-tables選項可禁用,對備份MyISAM的多個庫,可能會形成數據不一致

注:以上選項對InnoDB表同樣生效,實現溫備,但不推薦使用

 

**InnoDB****備份選項:**

l 支持熱備,可用溫備但不建議用

n --single-transaction 加此選項纔開啓事務 強烈推薦使用!

u 注意能夠隔離DML語句 但不能夠隔離DCL語句

n 此選項Innodb中推薦使用,不適用MyISAM,此選項會開始備份前,先執行START TRANSACTION指令開啓事務

n 此選項經過在單個事務中轉儲全部表來建立一致的快照。 僅適用於存儲在支持多版本控制的存儲引擎中的表(目前只有InnoDB能夠); 轉儲不保證與其餘存儲引擎保持一致。 在進行單事務轉儲時,要確保有效的轉儲文件(正確的表內容和二進制日誌位置),沒有其餘鏈接應該使用如下語句:ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE

n 此選項和--lock-tables(此選項隱含提交掛起的事務)選項是相互排斥

n 備份大型表時,建議將--single-transaction選項和--quick結合一塊兒使用

 

**InnoDB****建議備份策略**

mysqldump –uroot –A –F –E –R --single-transaction --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql

**MyISAM****建議備份策略**

mysqldump –uroot –A –F –E –R –x --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql

 

 

實驗:刪除數據庫還原至最新狀態

1. 備份

a) 數據庫和二進制文件分離存放

b) 確認字符集和存儲引擎

c) 作徹底備份命令

d) 對數據庫修改

e) 破壞數據庫: rm –rf /var/lib/mysql*

2. 還原

a) 禁止用戶訪問

b)

 

 

 

生產中通常都是人爲刪除形成的數據庫損壞:人爲損壞數據庫恢復方法:恢復誤操做

\1. 禁止用戶訪問

\2. 關閉二進制日誌: set sql_log_bin=off; 查看是成功關閉: select @@sql_log_bin;

\3. 還原徹底備份 mysql> source /路徑/徹底備份文件

\4. 查看二進制日誌 找出徹底備份的時間 肯定二進制日誌的位置

\5. mysqlbinlog mysql-bin.000011 > /路徑/文件

\6. 打開此文件 找到DROP命令並刪除

\7. mysql > source /路徑/文件

\8. 開放二進制日誌

 

 

 

 

 

 

 

 

 

 

### xtrabackup進行備份的工具

是進行備份的工具

l **特色:**

n 備份還原過程快速、可靠

n 備份過程不會打斷正在執行的事務

n 可以基於壓縮等功能節約磁盤空間和流量

n 自動實現備份檢驗

n 開源,免費

Xtrabackup的新版變化:

l xtrabackup版本升級到2.4後,相比以前的2.1有了比較大的變化:innobackupex 功能所有集成到 xtrabackup 裏面,只有一個 binary程序,另外爲了兼容考慮,innobackupex做爲 xtrabackup 的軟連接,即xtrabackup如今支持非Innodb表備份,而且 Innobackupex 在下一版本中移除,建議經過xtrabackup替換innobackupex

l xtrabackup安裝:

u yum install percona-xtrabackup 在EPEL源中

n 最新版本下載安裝:

u https://www.percona.com/downloads/XtraBackup/LATEST/

 

 

 

Xtrabackup2.2版以前包括4個可執行文件:

n innobackupex: Perl 腳本

n xtrabackup: C/C++ 編譯的二進制

n xbcrypt: 加解密

n xbstream: 支持併發寫的流文件格式

n xtrabackup 是用來備份 InnoDB 表的,不能備份非 InnoDB 表,和 MySQL Server 沒有交互

l innobackupex 腳本用來備份非 InnoDB 表,同時會調用 xtrabackup 命令來備份 InnoDB 表,還會和 MySQL Server 發送命令進行交互,如加全局讀鎖(FTWRL)、獲取位點(SHOW SLAVE STATUS)等。即innobackupex是在 xtrabackup 之上作了一層封裝實現的

l 雖然目前通常不用 MyISAM 表,只是 MySQL 庫下的系統表是 MyISAM 的,所以備份基本都經過 innobackupex 命令進行

 

 

#### xtrabackup用法

備份:innobackupex [option] BACKUP-ROOT-DIR

選項說明:https://www.percona.com/doc/percona-xtrabackup/LATEST/genindex.html

l

n --user:該選項表示備份帳號

n --password:該選項表示備份的密碼

n --host:該選項表示備份數據庫的地址

n --databases:該選項接受的參數爲數據庫名,若是要指定多個數據庫,彼此間須要以空格隔開;如:"xtra_test dba_test",同時,在指定某數據庫時,也能夠只指定其中的某張表。如:"mydatabase.mytable"。該選項對innodb引擎表無效,仍是會備份全部innodb表

n --defaults-file:該選項指定從哪一個文件讀取MySQL配置,必須放在命令行第一個選項位置

n --incremental:該選項表示建立一個增量備份,須要指定--incremental-basedir

n --incremental-basedir:該選項指定爲前一次全備份或增量備份的目錄,與--incremental同時使用

n --incremental-dir:該選項表示還原時增量備份的目錄

n --include=name:指定表名,格式:databasename.tablename

l Prepare:innobackupex --apply-log [option] BACKUP-DIR

n 選項說明:

n --apply-log:通常狀況下,在備份完成後,數據尚且不能用於恢復操做,由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。所以,此時數據文件仍處理不一致狀態。此選項做用是經過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態

n --use-memory:和--apply-log選項一塊兒使用,當prepare 備份時,作crash recovery分配的內存大小,單位字節,也可1MB,1M,1G,1GB等,推薦1G

n --export:表示開啓可導出單獨的表以後再導入其餘Mysql中

n --redo-only:此選項在prepare base full backup,往其中合併增量備份時候使用,但不包括對最後一個增量備份的合併 只要不是最後一個徹底備份就需加上此項

l **還原:innobackupex --copy-back [****選項] BACKUP-DIR**

n innobackupex --move-back [選項] [--defaults-group=GROUP-NAME] BACKUP-DIR

n 選項說明:

n --copy-back:作數據恢復時將備份數據文件拷貝到MySQL服務器的datadir

n --move-back:這個選項與--copy-back類似,惟一的區別是它不拷貝文件,而是移動文件到目的地。這個選項移除backup文件,用時候必須當心。使用場景:沒有足夠的磁盤空間同事保留數據文件和Backup副本

n **還原注意事項:**

n 1.datadir 目錄必須爲空。除非指定innobackupex --force-non-empty-directorires選項指定,不然--copy-backup選項不會覆蓋

n 2.在restore以前,必須shutdown MySQL實例,不能將一個運行中的實例restore到datadir目錄中

n 3.因爲文件屬性會被保留,大部分狀況下須要在啓動實例以前將文件的屬主改成mysql,這些文件將屬於建立備份的用戶

n chown -R mysql:mysql /data/mysql

n 以上須要在用戶調用innobackupex以前完成

n --force-non-empty-directories:指定該參數時候,使得innobackupex --copy-back或--move-back選項轉移文件到非空目錄,已存在的文件不會被覆蓋。若是--copy-back和--move-back文件須要從備份目錄拷貝一個在datadir已經存在的文件,會報錯失敗

l **備份生成的相關文件**

n 使用innobakupex備份時,其會調用xtrabackup備份全部的InnoDB表,複製全部關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命名的目錄中,在備份時,innobackupex還會在備份目錄中建立以下文件:

n (1)xtrabackup_info:innobackupex工具執行時的相關信息,包括版本,備份選項,備份時長,備份LSN(log sequence number日誌序列號),BINLOG的位置

n (2)xtrabackup_checkpoints:備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared狀態)和LSN範圍信息,每一個InnoDB頁(一般爲16k大小)都會包含一個日誌序列號LSN。LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的

n (3)xtrabackup_binlog_info:MySQL服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置,可利用實現基於binlog的恢復

n (4)backup-my.cnf:備份命令用到的配置選項信息

n (5)xtrabackup_logfile:備份生成的日誌文件

 

 

**Xtrabackup****備份過程**

 

 

 

**示例**:**新版Xtrabackup****徹底備份及還原**

l 1 在原主機作徹底備份到/data/backups

n xtrabackup --backup --target-dir=/backups/ 指定備份到哪 注意是徹底備份

n scp -r /backups/* 目標主機:/backups

l 2 在目標主機上

n 預準備:確保數據一致,提交完成的事務,回滾未完成的事務 xtrabackup --prepare --target-dir=/backups/

n 複製到數據庫目錄 注意:數據庫目錄必須爲空,MySQL服務不能啓動 xtrabackup --copy-back –target-dir=/backups/

n 還原屬性chown -R mysql:mysql /var/lib/mysql

n 啓動服務 systemctl start mariadb

 

 

**示例:新版xtrabackup****徹底,增量備份及還原**

l **1)** **備份過程**

a) 徹底備份:xtrabackup --backup --target-dir=/backups/base

b) 第一次修改數據

c) 第一次增量備份 xtrabackup --backup --target-dir=/backups/inc1 --incremental-basedir=/backups/base

d) 第二次修改數據

e) 第二次增量備份 xtrabackup --backup --target-dir=/backups/inc2 --incremental-basedir=/backups/inc1

f) scp -r /backups/* 目標主機:/backups/

2) 備份過程生成三個備份目錄 /backups/{base,inc1,inc2}

l **2****還原過程**

1) 預準備完成備份,此選項--apply-log-only 阻止回滾未完成的事務

a) xtrabackup --prepare --apply-log-only --target-dir=/backups/base

2) 合併第1次增量備份到徹底備份,

a) xtrabackup --prepare **--apply-log-only** --target-dir=/backups/base **--incremental-dir=/backups/inc1**

3) 合併第2次增量備份到徹底備份:最後一次還原不須要加選項--apply-log-only

a) xtrabackup --prepare --target-dir=/backups/base --incremental-dir=/backups/inc2

4) 複製到數據庫目錄,注意數據庫目錄必須爲空,MySQL服務不能啓動

a) xtrabackup **--copy-back** --target-dir=/data/backups/base

5) 還原屬性:chown -R mysql:mysql /var/lib/mysql

6) 啓動服務:systemctl start mariadb

 

 

 

**示例: xtrabackup****單表導出和導入**

1 單表備份 innobackupex --include='hellodb.students' /backups

2備份表結構 mysql -e 'show create table hellodb.students' > student.sql

3刪除表mysql -e 'drop table hellodb.students‘

4 innobackupex --apply-log --export /backups/2018-02-23_15-03-23/

5 建立表

mysql>CREATE TABLE `students` ( `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT, `Name` varchar(50) NOT NULL, `Age` tinyint(3) unsigned NOT NULL, `Gender` enum('F','M') NOT NULL, `ClassID` tinyint(3) unsigned DEFAULT NULL, `TeacherID` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`StuID`) ) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8

 

6 刪除表空間 alter table students discard tablespace; 此命令是刪除表數據

7 cp /backups/2018-02-23_15-03-23/hellodb/students.{cfg,exp,ibd} /var/lib/mysql/hellodb/

8 chown -R mysql.mysql /var/lib/mysql/hellodb/

9 mysql>alter table students import tablespace;

 

 

 

 

 

 

 

 

 

 

 

## MySQL複製

主從複製不能代替備份

l 擴展方式: Scale Up 向上擴展(升級設備), Scale Out橫向擴展 生產中通常選擇此方式

l MySQL的擴展

1) 讀寫分離

2) 複製: 每一個節點都有相同的數據集

向外擴展

二進制日誌

單向

l 複製的功用:

數據分佈

負載均衡讀

備份

高可用和故障切換

MySQL升級測試

 

 

 

**主從複製線程:**

1 主節點:

1.1 dump Thread:爲每一個Slave的I/O Thread啓動一個dump線程,用於向其發送binary log events

2 從節點:

2.1 I/O Thread:向Master請求二進制日誌事件,並保存於中繼日誌中

2.2 SQL Thread:從中繼日誌中讀取日誌事件,在本地完成重放

3 跟複製功能相關的文件:

3.1 master.info:用於保存slave鏈接至master時的相關信息,例如帳號、密碼、服務器地址等

3.2 relay-log.info:保存在當前slave節點上已經複製的當前二進制日誌和本地replay log日誌的對應關係

4 主從複製特色:

4.1 異步複製

4.2 主從數據不一致比較常見

5 複製架構:

5.1 Master/Slave, Master/Master, 環狀複製

5.2 一主多從

5.3 從服務器還能夠再有從服務器

5.4 一從多主:適用於多個不一樣數據庫

6 複製須要考慮二進制日誌事件記錄格式

6.1 STATEMENT(5.0以前)

6.2 ROW(5.1以後,推薦)

6.3 MIXED

 

 

 

 

**主從複製原理:**

\1. 首先主服務器收到用戶的寫操做

\2. 把數據庫的更新寫入二進制日誌 在主服務器有一個專門的線程 dump 線程 利用dump線程經過網絡發送到從服務器

\3. 從服務器用 io thread接收

\4. 而後寫入到Relay Log(就是二進制日誌) 此處是臨時存儲

\5. 利用SQL Thread更新

\6.

 

 

 

**主服務器配置:** **主節點配置**

(1) 啓用二進制日誌

[mysqld]

log_bin

(2) 爲當前節點設置一個全局唯一的ID號

[mysqld]

server_id=#

log-basename=master 可選項,設置datadir中日誌名稱,確保不依賴主機名

(3) 建立有複製權限的用戶帳號

GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY 'replpass';

 

**從節點配置:從服務器配置**

(1) 啓動中繼日誌

[mysqld]

read-only 設爲普通用戶只讀 能夠不加但建議加上

server_id=# 爲當前節點設置一個全局唯的ID號

relay_log=relay-log relay log的文件路徑,默認值hostname-relay-bin

relay_log_index=relay-log.index 默認值hostname-relay-bin.index

(2) 使用有複製權限的用戶帳號鏈接至主服務器,並啓動複製線程

mysql> CHANGE MASTER TO MASTER_HOST='host', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysql-bin.xxxxx', MASTER_LOG_POS=#;

mysql> START SLAVE [IO_THREAD|SQL_THREAD];

 

 

 

**若是主節點已經運行了一段時間,且有大量數據時,如何配置並啓動slave****節點**

Ø 經過備份恢復數據至從服務器

Ø 複製起始位置爲備份時,二進制日誌文件及其POS

**若是要啓用級聯複製,****須要在從服務器啓用如下配置**

Ø [mysqld]

Ø log_bin

Ø log_slave_updates

**複製架構中應該注意的問題:**

一、限制從服務器爲只讀

Ø 在從服務器上設置read_only=ON

注意:此限制對擁有SUPER權限的用戶均無效

Ø 阻止全部用戶, 包括主服務器複製的更新 mysql> FLUSH TABLES WITH READ LOCK;

二、RESET SLAVE

在從服務器清除master.info ,relay-log.info, relay log ,開始新的relay log ,注意:須要先STOP SLAVE

RESET SLAVE ALL 清除全部從服務器上設置的主服務器同步信息如:PORT, HOST, USER和 PASSWORD 等

三、sql_slave_skip_counter = N 從服務器忽略幾個主服務器的複製事件,global變量 (忽略錯誤)

set global sql_slave_skip_counter=1 忽略主從複製過程當中的錯誤 數量爲1

​ 注意需先將服務中止

四、如何保證主從複製的事務安全

參看https://mariadb.com/kb/en/library/server-system-variables/

Ø 在master節點啓用參數:

sync_binlog=1 每次寫後當即同步二進制日誌到磁盤,性能差 能夠考慮變爲0

若是用到的爲InnoDB存儲引擎:

innodb_flush_log_at_trx_commit=1 每次事務提交當即同步日誌寫磁盤

innodb_support_xa=ON 默認值,分佈式事務MariaDB10.3.0廢除

sync_master_info=# #次事件後master.info同步到磁盤

master_info是存儲複製信息的

Ø 在slave節點啓用服務器選項: skip_slave_start=ON 不自動啓動slave

此項默認爲ON

Ø 在slave節點啓用參數:

sync_relay_log=# #次寫後同步relay log到磁盤

sync_relay_log_info=# #次事務後同步relay-log.info到磁盤

 

 

 

## 主主複製

l 主主複製:互爲主從

1) 容易產生的問題:數據不一致;所以慎用

2) 考慮要點:自動增加id

a) 配置一個節點使用奇數id

b) auto_increment_offset=1 開始點

c) auto_increment_increment=2 增加幅度

d) 另外一個節點使用偶數id

e) auto_increment_offset=2

f) auto_increment_increment=2

 

主主複製的配置步驟:

(1) 各節點使用一個唯一server_id

(2) 都啓動binary log和relay log

(3) 建立擁有複製權限的用戶帳號

(4) 定義自動增加id字段的數值範圍各爲奇偶

(5) 均把對方指定爲主節點,並啓動複製線程

 

 

 

 

 

 

 

 

 

 

 

 

### 半同步複製

半同步不確保全部從服務器都同步 只有一個服務器同步成功則會成功

會有一個超時時長,當超過這時長也會返回成功值

主從複製配合半同步複製

需安裝插件,在全部的節點內都需安裝此插件 主服務器安裝:‘semisync_master’ 從服務器安裝’semisync_slave’

主服務器:建立帳號

 

從服務器:開始複製

 

#### 實現半同步:主服務器上配置

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; 安裝插件

mysql>SET GLOBAL rpl_semi_sync_master_enabled=1; 啓用插件 0表示不啓用 如想要一直啓用需寫入到配置文件內

mysql>SET GLOBAL rpl_semi_sync_master_timeout = 1000;設置超時長爲1s 設置超時時長 毫秒爲單位 默認是10秒最好寫入到配置文件內

mysql>SHOW GLOBAL VARIABLES LIKE '%semi%'; 查看配置

mysql>SHOW GLOBAL STATUS LIKE '%semi% ‘; 查看目前的狀態

 

**從服務器配置** **重此操做在全部的從節點上**

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 安裝插件

mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1; 啓用插件 永久保存需寫入配置文件內

mysql> select @@rpl_semi_sync_slave_enabled; 查看插件是否啓用

從節點配置查看 show slave status

 

 

 

 

 

 

### mysql複製過濾器

**從服務器上的複製過濾器相關變量**

replicate_do_db= 指定複製庫的白名單

replicate_ignore_db= 指定複製庫黑名單

replicate_do_table= 指定複製表的白名單

replicate_ignore_table= 指定複製表的黑名單

replicate_wild_do_table= foo%.bar% 支持通配符

replicate_wild_ignore_table=

 

 

 

 

### 基於SSL複製:

l 在默認的主從複製過程或遠程鏈接到MySQL/MariaDB全部的連接通訊中的數據都是明文的,外網裏訪問數據或則複製,存在安全隱患。經過SSL/TLS加密的方式進行復制的方法,來進一步提升數據的安全性

l 配置實現:

1) 參看:https://mariadb.com/kb/en/library/replication-with-secure-connections/

l 主服務器開啓SSL:[mysqld] 加一行ssl

l 主服務器配置證書和私鑰;而且建立一個要求必須使用SSL鏈接的複製帳號

l 從服務器使用CHANGER MASTER TO 命令時指明ssl相關選項

 

**Master****服務器配置**

[mysqld] log-bin server_id=1 ssl ssl-ca=/etc/my.cnf.d/ssl/cacert.pem ssl-cert=/etc/my.cnf.d/ssl/master.crt ssl-key=/etc/my.cnf.d/ssl/master.key

 

 

**Slave****服務器配置**

mysql> CHANGE MASTER TO MASTER_HOST='MASTERIP', MASTER_USER='rep', MASTER_PASSWORD='centos', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245, MASTER_SSL=1, **MASTER_SSL_CA = '/etc/my.cnf.d/ssl/cacert.pem',** **MASTER_SSL_CERT = '/etc/my.cnf.d/ssl/slave.crt',** **MASTER_SSL_KEY = '/etc/my.cnf.d/ssl/slave.key';** **注意:加粗字體能夠寫到my.cnf裏面**

 

 

## 複製的監控和維護

1、 清理日誌

1) PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr } 清理二進制日誌到哪一個位置以前

2) RESET MASTER

3) RESET SLAVE

2、 複製監控

1) SHOW MASTER STATUS

2) SHOW BINLOG EVENTS

3) SHOW BINARY LOGS

4) SHOW SLAVE STATUS

5) SHOW PROCESSLIST

3、從服務器是否落後於主服務

1) Seconds_Behind_Master: 0

4、如何肯定主從節點數據是否一致

2) percona-tools

5、 數據不一致如何修復

3) 刪除從數據庫,從新複製

 

 

 

 

### MySQL讀寫分離

讀寫分離應用:

mysql-proxy:Oracle,https://downloads.mysql.com/archives/proxy/ Atlas:Qihoo,https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md dbproxy:美團,https://github.com/Meituan-Dianping/DBProxy Cetus:網易樂得,https://github.com/Lede-Inc/cetus Amoeba:https://sourceforge.net/projects/amoeba/ Cobar:阿里巴巴,Amoeba的升級版 Mycat:基於Cobar, http://www.mycat.io/ ProxySQL:https://proxysql.com/

**ProxySQL**

注意用這個的話從服務器必需要加read-only

準備:實現讀寫分離前,先實現主從複製

注意:slave節點需設置read-only

啓動proxysql:service proxysql start

啓動後會監聽兩個默認端口

6032:proxysql的管理端口

6033:proxysql對外提供服務的端口

使用mysql客戶端鏈接到proxysql的管理接口6032,默認管理員和密碼都是admin

mysql –uadmin –padmin –P6032 –h127.0.0.1

說明:在main和monitor數據庫中的表,runtime_開頭的是運行時的配置,不能修改,只能修改非runtime_表,修改後必須執行load…to runtime才能加載到runtime生效,執行save…to disk降配置持久化保存到磁盤

 

proxysql實現讀寫分離

 

# ansible自動化運維

術語:本地部署:on-premises 基礎設施即服務:laas 平臺即服務paas 軟件即服務:saas

灰度發佈又稱爲金絲雀發佈:先上線一部分

藍綠髮布:主 備 兩套環境

- 主:活動,綠色 v1.0 --> 備
- 備:非活動,藍色 v2.0 --> 主

Ansible 適用於中小應用環境

 

**注意默認以key驗證方式鏈接**

腳本在這裏被稱爲劇本(playbook) 好多個劇本放在一塊兒叫角色

 

## ansible特性

1. 模塊化:調用特定的模塊,完成特定任務1800多個模塊 能夠將每一個模塊理解爲命令

2. 有Paramiko,PyYAML(劇本),Jinja2(模板語言)三個關鍵模塊

3. 支持自定義模塊

4. 基於Python語言實現

5. 部署簡單,基於python和SSH(默認已安裝),基於agentless(無代理 沒必要安裝代理軟件)

6. 安全,基於OpenSSH

7. 支持playbook編排任務

8. 冪等性:一個任務執行1遍和執行n遍效果同樣,不因重複執行帶來意外狀況

9. 無需代理不依賴PKI(無需ssl)

10. 可以使用任何編程語言寫模塊

11. YAML格式,編排任務,支持豐富的數據結構

12. 較強大的多層解決方案

 

劇本的集合是角色Ansible Roles

實現的是集中管理而不是對外服務

實現集中管理: 1對多 不是基於c/s結構的

安裝ansibler的稱爲控制端 被管理的稱爲被控制端[基於無代理方式實現被控制:agentless.需基於key驗證]

 

## ansible安裝

1. 安裝yum install ansible 基於epel源的

### 編譯安裝:

1. yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto

2. tar xf ansible-1.5.4.tar.gz

3. cd ansible-1.5.4

4. python setup.py build

5. python setup.py install

6. mkdir /etc/ansible

7. cp -r examples/* /etc/ansible

查看版本: ansible --version

 

## ansible相關文件

### 配置文件

- /etc/ansible/ansible.cfg 主配置文件,配置ansible工做特性 通常保持默認.此文件內是默認值,但劇本執行的東西可能會覆蓋此時的設置. 日誌建議啓用和host_key_checking取消註釋後則登錄每一個主機不須要輸入yes 取消ssh key的檢查
- ![1545705812530](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1545705812530.png)
- ![1545705819975](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1545705819975.png)
- /etc/ansible/hosts 主機清單 是文本文件 在這存儲了要管理的主機的IP地址 可分組,可在主機後加端口號,可寫成[a:f]表示a到f
- /etc/ansible/roles/ 存放角色的目錄

### 程序

- /usr/bin/ansible 主程序,臨時命令執行工具 可執行命令

- /usr/bin/ansible-doc 查看配置文檔,幫助文檔 能夠理解爲man幫助

- /usr/bin/ansible-galaxy 下載/上傳優秀代碼或Roles模塊的官網平臺

- /usr/bin/ansible-playbook 定製自動化任務,編排劇本工具/usr/bin/ansible-pull 遠程執行命令的工具

- /usr/bin/ansible-vault 文件加密工具

- /usr/bin/ansible-console 基於Console界面與用戶交互的執行工具

 

## ansible系列命令

ansible; ansible-doc; ansible-playbook; ansible-vault; ansible-console; ansible-galaxy; ansible-pull

 

- **ansible-doc:顯示模塊幫助**
- `ansible-doc [options][module]`
- -a 顯示全部模塊的文檔
- -l,--list 列出可用模塊 前面顯示的是模塊名 後面顯示的是此模塊是作什麼的
- -s,--snippet 顯式指定模塊的playbook片斷

- 示例:
- ansible-doc –l 列出全部模塊
- ansible-doc ping模塊 查看指定ping模塊幫助用法
- ansible-doc –s ping 查看指定模塊幫助用法 以片斷方式查看

 

- **ansible-galaxy管理角色的**
- **Ansible-pull 推送命令至遠程,效率無限提高**
- **Ansible-playbook(劇本) 執行playbook的**
- 示例:ansible-playbook hello.yml
- **Ansible-vault 管理加密yml文件**
- 直接建立加密yml文件Ansible-vault create hello2.yml
- 加密:ansible-vault encrypt hello.yml
- 不解密查看加密文件內容ansible-vault view hello.yml
- 不解密編輯加密文件
- 更改口令ansible-vault rekey hello.yml
- 解密ansible-vault decrypt hello.yml
- **Ansible-console交互式執行ansible命令**
- 更改命令併發數爲10個 forks 10
- List列出當前管理的主機
- 遠程建立文件:file

 

### ansible語法

`ansible <host-pattern> [-m module_name][-a args]`

- <host-pattern>主機清單裏面的分組名或是主機 -m是模塊 -a是模塊帶的參數

- --version 顯示版本
- -m module 指定模塊,默認爲command
- -v 詳細過程 –vv -vvv更詳細 執行過程
- --list-hosts 顯示主機列表,可簡寫 --list
- -k, --ask-pass 提示輸入ssh鏈接密碼,默認Key驗證
- -K, --ask-become-pass 提示輸入sudo時的口令;在sudo配置文件裏添加NOPASSWD 則不須要每次輸入口令
- ![1545706673592](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1545706673592.png)
- -C, --check 檢查,並不執行
- -T, --timeout=TIMEOUT 執行命令的超時時間,默認10s
- -u, --user=REMOTE_USER 執行遠程執行的用戶
- -b, --become 代替舊版的sudo 切換
- --become-user=USERNAME 指定sudo的runas用戶,默認爲root

- **ansible的Host-pattern**

- ALL:表示全部inventory中的左右主機
- ansible -all -m ping

* :通配符
* ansible 「*」-m ping

* ansible 192.168.1.* -m ping

* ansible 「*srvs」-m ping

- 或關係
- ansible 「websrvs:&dbsrvs」 –m ping
- n ansible 「192.168.1.10:192.168.1.20」 -m ping

- 邏輯與
- ansible 「websrvs:&dbsrvs」 –m ping
- 在websrvs組而且在dbsrvs組中的主機

- 邏輯非
- ansible ‘websrvs:!dbsrvs’ –m ping
- 在websrvs組,但不在dbsrvs組中的主機
- 注意:此處爲單引號
- 綜合邏輯
- ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' -m ping
- 正則表達式
- ansible 「websrvs:&dbsrvs」 –m ping
- ansible 「~(web|db).*\.magedu\.com」 –m ping

## ansible經常使用模塊

使用哪一個模塊需標明 ansible 管理主機 -m shell/copy/file/yum

- command模塊:在遠程值機執行命令,默認模塊,可忽略-m選項
- ![1545707178954](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1545707178954.png)
- ![1545707188373](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1545707188373.png)
- 此模塊不支持$VARNAME < > | ; & 等,可用shell模塊實現
- shell: 與command命令大體相同 支持 < > | ; & 等符號 能夠將此模塊設爲默認模塊
- ![1545707231960](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1545707231960.png)
- 將shell模塊設爲默認模塊 vim /etc/ansible/ansible.cfg 將註釋去掉 並將command替換爲shell 設置默認模塊
- ![1545707252192](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1545707252192.png)
- script:將ansible控制端的腳本在遠程主機上執行
- ![1545707272564](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1545707272564.png)
- 注意:shell模塊與script模塊有兩個相同的參數 removes和 creates creates 若是已經存在則此步驟不執行 removes是若是此文件存在則執行 若是此文件不存在則不執行
- ![1545707319469](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1545707319469.png)
- copy模塊,複製模塊 將控制端文件拷貝至被控制端 要指定文件的源文件 還要指定目標路徑
- 重要的參數 backup是若是目標主機已經存在要拷貝的文件此參數會將目標主機的文件作備份
- content後面加文本內容 能夠將文本的內容拷貝至遠程
- dest指定目標路徑
- owner是全部者
- mode是權限
- backup是若是目標存在則備份
- ![1545707391604](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1545707391604.png)
- Fetch模塊,從客戶端抓取文件至控制端.抓取模塊 如今只能抓取文件不能抓目錄 目錄可先壓縮 `ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts’`
- Hostname管理主機名 ansible經常使用模塊
- Cron模塊 計劃任務
- Yum模塊 安裝包,管理包
- Setup模塊查看系統信息

### Playbook核心元素

- Hosts 是執行的目標主機
- 示例:- hosts: websrvs(應用在哪一個主機上)
- remote_user: root以什麼身份執行
- 示例: - hosts websrvs
- remote_user: root
- task列表裏面要執行命令的列表
- 兩種格式:1)action: module arguments 2)module

#### Playbook中變量使用
變量名:僅能由字母,數字和下劃線組成,且只能以字母開頭

 

 

模板template
只能用於ansible-playbook中
Template文件必須存放在templates目錄下,且命名爲.j2結尾
迭代:with_items
迭代:當有須要重複性執行的任務時,能夠使用迭代機制

 

### role角色

用playbook實現 playbook必須放在和角色(roles)同級的目錄下

實現簡單的角色

![1545707661773](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1545707661773.png)

 

 

 

 

 

# KVM

### 基礎知識:

1. xml文件能夠理解爲配置文件
2. img文件能夠理解爲磁盤映像文件即ISO

 

 

* kvm是一種虛擬化技術;主機級虛擬化技術

1. 目前僅支持X86_64位的

2. HVM 僅支持藉助於硬件輔助虛擬化作徹底虛擬化;硬件必須支持虛擬化如CPU

3. 在內核中實現的

* kvm僅僅是內核中的一個內核模塊

1. 底層依賴於adm或intel的虛擬化技術

2. 來構建內核的虛擬化軟件'/dev/kvm';(任何一個若是軟件只在內核中有,想要在用戶空間使用必需要有用戶空間工具進行交互)

3. 經過系統調用ioctl接口向用戶控件輸出

4. 在用戶空間要想建立或啓動一個虛擬機必需要有一個對應的軟件qemu-kvm

- 用戶空間的管理KVM工具

1. qemu-kvm命令行工具;不能作快照需用qemu-img
2. qemu-img管理磁盤鏡像文件;管理磁盤映像文件;命令行工具
3. **libvirt** 配合**virt-manager**圖形化管理工具
1. libvirt和libvirtd
2. virt-manager虛擬機管理軟件
3. virt-viewer若是隻需運行則使用這個
4. virtinst安裝虛擬機;命令行工具
5. virsh 命令行管理虛擬機

## 安裝KVM

判斷當前CPU是否支持支持kvm

```shell
grep -I -E '(vxm|svm|lm)' /proc/cpuinfo
vxm和svm兩者有其一
lm必須有 才能夠安裝kvm
```

啓用KVM;啓用KVM;KVM無需下載只要啓用便可

```shell
modprobe kvm
```

判斷啓用失敗成功

```shell
lsmod | grep kvm
```

使用virt-manager管理KVM;必定要注意yum源的地址與本身系統版本絕對匹配

```shell
yum install qeum-kvm libvirt-daemon-kvm libvirt virt-manager
modprobe kvm
systemctl start libvirtd.service 啓動libvirtd守護進程 注意libvirtd的d
啓動:virt-manager
注意要有桌面系統
```

 

libvirt網卡是默認NAT模式的;更改成橋接; NAT模式網卡更改成橋接;libvirt網卡更改成橋接模式

橋接網絡就是將物理網卡當交換機使用;將軟交換機當作物理網卡使用

```shell
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens32 ifcfg-br0 拷貝一份網卡配置文件
設置拷貝過來的將br0看成網卡用;而ens32看成交換機來用
```

編輯原來的網卡的配置文件

`vim ifcfg-ens32`

添加一行BRIDGE=br0

![1545711954193](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1545711954193.png)

- 示例:

```
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
```


編輯ifcfg-br0

![1545711973254](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1545711973254.png)

示例:

```

```

 

 

遠程連接是**加上** **-X**選項;打開圖形轉發

在桌面系統上: ssh -X root@IP地址

在xshell上:virt-manager

 

 

若是鍵盤很差用則在虛擬機上的虛擬機中的設置立案更改Display 中的type類型爲vnc

 

 

## KVM管理工具

1. virt-manager
1. 使用virt-manager工具建立虛擬機;而後再用其餘命令行工具進行管理
2. virsh
1. virsh不只僅可以建立虛擬機並且還能全方位的管理虛擬機
3. qeum-kvm

 

 

- virsh家族或libvirt家族建立的虛擬機都會生成一個.xml的配置文件;存放在`/etc/libvirt/qemu`目錄下

 

 

![1545713226207](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1545713226207.png)

 

每一個使用virsh建立的虛擬機都表現爲宿主機上的一個進程

 

 

### 使用virsh管理建立虛擬機

- 手動建立虛擬機;使用命令來管理
- virsh可以對虛擬機進行全生命週期管理的;但不推薦用於建立虛擬機;建議使用virt-manager建立完成虛擬機以後將虛擬機配置文件看成模板使用
- virsh的各類功能都經過子命令來實現
- 查看幫助:virsh help
- 查看特定的組的幫助:virsh help 組名;例如:virsh help domain(只顯示和域相關的命令)
- virsh能夠進入交互式接口:輸入`virsh`

#### virsh dumpxml

顯示虛擬機詳情;建立虛擬機

- 使用幫助:`virsh help dumpxml`
- 使用格式:virsh dumpxml 虛擬機名稱

` virsh dump 虛擬機1` 查看虛擬機1的xml配置文件 能夠將此配置文件保存下來稍做修改便可建立虛擬機;但需注意要有.img文件

示例:

使用virt-manager建立出的虛擬機看成模板 virsh dumpxml 虛擬機名稱 > 將要建立的虛擬機名稱

**需注意路徑在/etc/libvirt/qemu/下;此時是相對路徑**

```shell
[root@centos7 qemu]# virsh dumpxml centos7.0 > centos7.1.xml
# 注意模板不加.xml 此時是將centos7看成模板文件
[root@centos7 qemu]# vim centos7.1.xml
# 編輯剛剛拷貝過來的.xml格式的配置文件
```

編輯拷貝過來的配置文件

```
<name>centos7.1</name>
# 將名字更改掉
<uuid>
#uuid刪掉;會自動生成
<memory unit='KiB'>2048000</memory>
# 內存大小;若是有必要則更改
<vcpu placement='static'>1</vcpu>
#使用幾顆虛擬CPU;注意不能超過宿主機的線程
<disk type='file' device='disk'>
# 磁盤映像文件 disk是磁盤
<driver name='qemu' type='qcow2'/>
名稱是qemu 類型是qcow2
<source file='/VMs/vm2/vm2.img>
磁盤映像文件路徑以及名稱
```

 

#### virsh list

- 使用幫助:virsh list --help
- 使用格式:`virsh list --選項`
- list選項:

```
--inactive 列出不活躍的域
--all 不活躍和活躍的域列表
--transient 列出臨時域
--persistent 列出持久域
--with-snapshot 列出現有快照的域
--without-snapshot 列出沒有快照的域
--state-running 運行狀態的域列表
--state-paused 列出暫停狀態的域
--state-shutoff 列出關閉狀態的域
--state-other 列出其餘狀態的域
--autostart 列出啓用 autostart 的域
--no-autostart 列出禁用 autostart 的域
--with-managed-save 列出有管理的保存狀態的域
--without-managed-save 列出沒有管理的保存狀態的域
--uuid 只列出 uuid
--name 只列出域名
--table 列出表格(默認)
--managed-save 標記有管理的保存狀態的域
--title show domain title
```

 

### 使用qemu-kvm管理vms:

1. Qemu:
​ 處理器模擬器
​ 仿真各類IO設備
​ 將仿真設備鏈接至主機的物理設備
​ 提供用戶接口

2. ​ qemu-kvm命令語法:

1. `qemu-kvm [options][disk_image]`
2. 選項有不少類別:
1. 標準選項、塊設備相關選項、顯示選項、網絡選項、...
2. 標準選項:
1. -machine [type=]name:-machine help來獲取列表,用於指定模擬的主機類型;
2. -cpu cpu:-cpu help來獲取列表;用於指定要模擬的CPU型號;
1. 能夠寫`-cpu host` 讀取物理機的cpu
3. `-smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]`:指明虛擬機上vcpu的數量及拓撲;
1. n是總的cpu核心數;maxcpus最大cpu核心數;cores表示每一個cpu有幾核;threads表示每核有幾線程;sockets表示有幾顆CPU;
4. `-boot [order=drives][,once=drives][,menu=on|off][,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off]`
​ order:各設備的引導次序:c表示第一塊硬盤,d表示第一個光驅設備;-boot order=dc,once=d
1. once是單次;
5. -m megs:以M虛擬機的內存大小;
6. -name NAME:當前虛擬機的名稱,要惟一;
3. 塊設備相關的選項:
1. -cdrom file:指定要使用光盤映像文件;
2. `-drive [file=file][,if=type][,media=d][,index=i] [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]`:

```shell
file=/PATH/TO/SOME_IMAGE_FILE:映像文件路徑;
if=TYPE:塊設備總線類型,ide, scsi, sd, floppy, virtio,...
media=TYPE:介質類型;設備類型,cdrom和disk;
index=i:設定同一類型設備多個設備的編號;自定義索引序號/索引順序
cache=writethrough(通寫)|writeback(回寫)|none(不啓用)|directsync(直接同步)|unsafe(非安全機制)[,format=f]:緩存方式;緩存會提高性能但也會帶來數據丟失的可能性 [format=f]磁盤映像文件的格式;例如:qcow2
CentOS磁盤鏡像文件下載:https://cloud.centos.org/centos/7/images/
```

1. 顯示選項:

1. -display type:顯示的類型,sdl, curses, none, spice和vnc;

1. spice是本地顯示;大多數使用vnc

2. -nographic:不使用圖形接口;表示沒有顯卡;但注意沒有顯卡也能顯示字符

3. -vga [std|cirrus|vmware|qxl|xenfb|none]:模擬出的顯卡的型號;

4. -vnc display[,option[,option[,...]]]]:啓動一個vnc server來顯示虛擬機接口; 讓qemu進程監聽一個vnc接口;

1. vnc:桌面號:5900+N

2. display:

1. HOST:N

在HOST主機的第N個桌面號輸出vnc;
5900+N

2. unix:/PATH/TO/SOCK_FILE

3. none

3. options:
​ ​ password:鏈接此服務所須要的密碼;

​ 還能夠使用系統認證

 

​ 5. -monitor stdio:在標準輸出上顯示monitor界面;qemu本身內置的監控界面

​ Ctrl-a, c:在console和monitor之間切換;
​ Ctrl-a, h

1. 網絡選項:
1. -nat選項在建立虛擬機時可能會指定屢次:正常狀況下當咱們虛擬一個網卡設備時要虛擬兩個;一個在宿主機上,一個在虛擬機上 -nat nic是爲虛擬建立;-nat tap是在宿主機上建立
2. `-net nic[,vlan=n][,macaddr=mac] [,model=type][,name=str] [,addr=str][,vectors=v]`

```shell
爲虛擬機建立一個網絡接口,並將其添加至指定的VLAN;
model=type:指明模擬出的網卡的型號,ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio;建議使用半虛擬化virtio
-net nic,model=?
macaddr=mac:指明mac地址;52:54:00:00:00 必定要更改mac地址
```

1. `-net tap[,vlan=n][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]:`
​ 經過物理的TAP網絡接口鏈接至vlan n;
​ script=file:啓動虛擬機時要執行的腳本,默認爲/etc/qemu-ifup 腳本用於實現將這個接口添加到橋上
​ downscript=dfile:關閉虛擬機時要執行的腳本,/etc/qemu-ifdown
​ ifname=NAME:自定義接口名稱;若是不指定則自動生成隨機名稱

​ 其餘選項:`-daeminize `以守護進程運行

2. 腳本實例:

```shell
#/etc/qemu-ifup
#!/bin/bash
#

bridge=br0
if [ -n "$1" ];then
ip link set $1 up
sleep 1
brctl addif $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no interface specified."
exit 2
fi
```

​ 示例:

本身建立一個橋`brctl addbr mybr0`

啓動 `brctl stp mybr0 on`

```shell
[root@node01 VMs]# qemu-kvm -cpu host -smp 4,sockets=2,cores=2,threads=1 -m 64 -name c1 -boot order=dc -drive file=/VMs/vm4/vm4.img,media=disk,if=virtion,cache=writeback,format=qcow2 -vnc :0 -net nic,macaddr=52:54:00:00:00:01,model=vittio -net tap,script=//etc/qeum-ifup
```

按回車以前要先寫完啓動腳本的;
鏈接:

 

1. 啓動鏈接:

yum install tigervnc

ssh -X root@IP地址

vncviewer :0

 

 

 

 

 

## 控制KVM虛擬機

對KVM來說每一個虛擬機的CPU(VCPU)都表現爲一個線程而已;不推薦單個虛擬機的CPU數量超過物理機的總線程;但多個虛擬機之和能夠超過(超配)

 

 

 

1. 重啓:
a) virsh help reboot熱重啓
b) virsh help reset 冷重啓;如同使用電源按鈕
2. virsh help undefined取消定義一個域
3. virsh help monitor
a) ![1545712277512](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1545712277512.png)
4. 管理虛擬機磁盤

1. qemu-img command [command iptions]
2. check 建立磁盤映像文件 建議使用qcow2的類型;還能夠檢查
5. -f 指定磁盤鏡像文件 -o ? 獲取幫助
6. qemu-img create -f qcow2 -o ? /VMs/vm2/mydisk.img
7. 使用稀疏格式: `qemu-img create -f qcow2 -o preallocation=metadata,size=10G /VMs/vm2/mydisk.img`
8. 磁盤文件格式轉換

1. convert
9. 快照

1. snapshot
10. 改變磁盤映像文件大小resize
11. 將磁盤熱插入到KVM虛擬機上
1. virsh help arrach-disk
2. 舉例:virsh attach-dish KVM虛擬機名稱 /VMs/vm2/mydish.img vda
3. 鏈接至KVM虛擬機查看:fdisk -l
12. 拆除KVM虛擬機上的硬盤;注意必定是未被使用的硬盤
1. virsh help datach-disk
2. 示例:virsh detach-disk c2 vda
13. 網卡熱插拔:
1. 注意一個虛擬網卡是兩部分組成;
2. 顯示有幾個網絡virsh net-list
3. 顯示有幾個網絡接口virsh iface -list

![1545712523339](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1545712523339.png)

 

 

 

## 預處理磁盤鏡像模板:libguestfs-tools

virt-sysprep:

​ --install

​ --enable

​ --list-operations

​ --operations

在一個純淨系統上實現

```shell
yum install qemu-kvm libvirt-daemon-kvm libvirt virt-manager libguestfs-tools -y
modprobe kvm
systemctl start libvirtd
```

​ 最後一步可能報錯是本地倉庫和遠程倉庫不匹配致使的解決辦法:

```shell
cd /etc/yum.repos.d/
vim CentOS-Base.repo
basrurl=找到與本身相匹配的yum源例如阿里雲
```

 

圖形管理工具

```shell
kimchi:基於H5研發web GUI; virt-king;推薦
OpenStack: IaaS
oVirt:配置很麻煩
proxmox:小型企業不錯的選擇
圖形管理工具棧https://www.linux-kvm.org/page/Management_Tools
```


### OpenStack

很是吃資源

 

## kimchi

基於wok這個插件運行的需先安裝wok

下載好komchi和wok以後

必須啓動而且設置好epel倉庫

yum install 剛剛下載的兩個包;解決依賴關係

啓動wok;會監聽8001端口

```shell
systemctl daemon-reload
systemctl start wokd
```

鏈接wok;在瀏覽器輸入ip地址:8001

 

 

 

# Redis

安裝高版本的要安裝源碼包

 

## buffer與cache

buffer:緩衝也叫寫緩衝,通常用於寫操做,能夠將數據先寫入內存在寫入磁盤,buffer 通常用於寫緩衝,用於解決不一樣介質的速度不一致的緩衝,先將數據臨時寫入到裏本身最近的地方,以提升寫入速度,CPU會把數據線寫到內存的磁盤緩衝區,而後就認爲數據已經寫入完成看,而後內核的線程在後面的時間在寫入磁盤,因此服務器忽然斷電會丟失內存中的部分數據。

cache:緩存也叫讀緩存,通常用於讀操做,CPU讀文件從內存讀,若是內存沒有就先從硬盤讀到內存再讀到CPU,將須要頻繁讀取的數據放在裏本身最近的緩存區域,下次讀取的時候便可快速讀取。

**cache纔是真正的緩存**

##### cache的保存位置

1. 客戶端:瀏覽器
2. 內存:本地服務器、遠程服務器(集羣)
3. 硬盤:本機硬盤、遠程服務器硬盤
4. 速度對比:客戶端瀏覽器-內存-遠程內存-硬盤-遠程硬盤。

cache的特性

1. 過時時間
2. 強制過時,源網站更新圖片後CDN是不會更新的,須要強制是圖片緩存過時
3. 命中率,即緩存的讀取命中率

 

 

## CDN

##### 什麼是CDN?

- 內容分發網絡(Content Delivery Network),經過將服務內容分發至全網加速節點,利用全球調度系統使用戶可以就近獲取,有效下降訪問延遲,提高服務可用性,
- CDN 第一下降機房的使用帶寬,由於不少資源經過CDN就直接返回用戶了,
- 第二解決不一樣運營商之間的互聯,由於可讓聯通的網絡訪問聯通讓電信的網絡訪問電信,起到加速用戶訪問的目的;
- 第三:解決用戶訪問的地域問題,就近返回

 

##### CDN優點

提早對靜態內容進行預緩存,避免大量的請求回源,致使主站網絡帶寬被打滿而致使數據沒法更新,另外CDN能夠將數據根據訪問的熱度不通而進行不通級別的緩存,例如訪問量最高的資源訪問CDN 邊緣節點的內存,其次的放在SSD或者SATA,再其次的放在雲存儲,這樣兼顧了速度與成本。緩存-緩存到最快的地方如內存,緩存的數據準確命中率高,訪問速度就快

調度準確-將用戶調度到最近的邊緣節點

性能優化-CDN 專門用於緩存響應速度快

安全相關-抵禦攻擊

節省帶寬:因爲用戶請求由邊緣節點響應,所以大幅下降到源站帶寬。

 

## Redis部署與使用

#### Redis基礎

Redis和Memcached是非關係型數據庫也成爲NoSQL,

MySQL、Mariadb、SQL Server、PostgreSQL、Oracle 數據庫屬於關係型數據(RDBMS,
Relational Database Management System)

 

#### Redis對比memcached

- 支持數據的持久化:能夠將內存中的數據保持在磁盤中,重啓redis服務或者服務器以後能夠從備份文件中恢復數據到內存繼續使用。
- 支持更多的數據類型:支持string(字符串)、hash(哈希數據)、list(列表)、set(集合)、zet(有序集合)
- 支持數據的備份:能夠實現相似於數據的master-slave模式的數據備份,另外也支持使用快照+AOF。
- 支持更大的value數據:memcache單個key value最大隻支持1MB,而redis最大支持512MB。
- Redis 是單線程,而memcache是多線程,因此單機狀況下沒有memcache併發高,但redis 支持分佈式集羣以實現更高的併發,單Redis實例能夠實現數萬併發。
- 支持集羣橫向擴展:基於redis cluster的橫向擴展,能夠實現分佈式集羣,大幅提高性能和數據安全性。
- 都是基於C語言開發。

 

#### redis典型應用場景

Session 共享:常見於web集羣中的Tomcat或者PHP中多web服務器session共享

消息隊列:ELK的日誌緩存、部分業務的訂閱發佈系統

計數器:訪問排行榜、商品瀏覽數等和次數相關的場景

緩存:數據查詢、電商網站商品信息、新聞內容

微博/微信社交場合:共同好友、點贊評論等

 

## 編譯安裝redis

需安裝gcc 和 gcc-devel

```shell
tar xf redis-5.0.3.tar.gz
cd redis-5.0.3
make PREFIX=/usr/local/redis install 指定安裝到什麼位置;
ll /usr/local/redis/
# total 0
# drwxr-xr-x 2 root root 134 Dec 13 09:21 bin

mkdir /usr/local/redis/etc
cp redis.conf /usr/local/redis/etc/
```

 

### 前臺啓動redis

```shell
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
二進制啓動服務 配置文件地址
```

 

### 解決redis啓動時的報錯

1. **tcp-backlog**

The backlog argument defines the maximum length to which the queue of pending connections for sockfd may grow. If a connection request arrives when the queue is full, the client may receive an error with an indication of ECONNREFUSED or, if the underlying protocol supports retransmission, the request may be ignored so that a later reattempt at connection succeeds.

backlog參數控制的是三次握手的時候server端收到client ack確認號以後的隊列值。

net.core.somaxconn = 512

 

2. **vm.overcommit_memory**

0、表示內核將檢查是否有足夠的可用內存供應用進程使用;若是有足夠的可用內存,內存申請容許;不然,內存申請失敗,並把錯誤返回給應用進程。

一、表示內核容許分配全部的物理內存,而無論當前的內存狀態如何。

二、表示內核容許分配超過全部物理內存和交換空間總和的內存

vm.overcommit_memory = 1

 

3. **transparent hugepage**

開啓大頁內存動態分配,須要關閉讓redis 負責內存管理。

echo never > /sys/kernel/mm/transparent_hugepage/enabled

 

 

 

 

 

### 編輯redis服務啓動腳本

```shell
# cat /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf --supervised systemd
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify
User=redis 能夠註釋掉;更改鏈接redis的用戶
Group=redis 若是不更改則需建立此用戶
RuntimeDirectory=redis
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target

建立用戶redis用戶:useradd redis -s /sbin/noligin
```

 

 

 

## 鏈接Redis

主要分爲運維人員的鏈接和程序的鏈接

#### 本機非密碼鏈接

```shell
redis-cli
```

#### 跨主機非密碼鏈接

```shell
redis-cli -h HOSTNAME/IP -p PORT
```

#### 跨主機密碼鏈接

```shell
redis-cli -h HOSTNAME/IP -p PORT -a PASSWORD
```

#### python鏈接方式

```python
#!/bin/env python
#Author:
import redis
import time
pool = redis.ConnectionPool(host="192.168.7.101",port=6379,password="")
r = redis,Redis(connection_pool=pool)
for i in range(100)
r.set("k%d" % i,"v%d % i")
time.sleep(1)
data=r.get("k%d" % i)
print(data)
```

## redis配置文件

```shell
bind 0.0.0.0 #監聽地址,能夠用空格隔開後多個監聽IP

protected-mode yes #redis3.2 以後加入的新特性,在沒有設置bind IP和密碼的時候只容許訪問127.0.0.1:6379

port 6379 #監聽端口

tcp-backlog 511 #三次握手的時候server端收到client ack確認號以後的隊列值。

timeout 0 #客戶端和Redis服務端的鏈接超時時間,默認是0,表示永不超時。

tcp-keepalive 300 #tcp 會話保持時間;秒爲單位

daemonize no #認狀況下 redis 不是做爲守護進程運行的,若是你想讓它在後臺運行,你就把它改爲 yes,當redis做爲守護進程運行的時候,它會自動寫一個 pid 到 /var/run/redis.pid 文件裏面
注意要有權限! redis的權限

supervised no #和操做系統相關參數,能夠設置經過upstart和systemd管理Redis守護進程,centos 7之後都使用systemd

pidfile /var/run/redis_6379.pid #pid文件路徑
注意與7相同要有權限;

loglevel notice #日誌級別

logfile "" #日誌路徑

databases 16 #設置db 庫數量,默認16個庫
0開始;到15

always-show-logo yes #在啓動redis 時是否顯示log

save 900 1 #在900秒內有一個鍵內容發生更改就出就快照機制

save 300 10

save 60 10000

stop-writes-on-bgsave-error yes #快照出錯時是否禁止redis 寫入操做

rdbcompression yes #持久化到RDB文件時,是否壓縮,"yes"爲壓縮,"no"則反之

rdbchecksum yes #是否開啓RC64校驗,默認是開啓

dbfilename dump.rdb #快照文件名

dir ./ #快照文件保存路徑通常會更改成絕對路徑


###########################################################################
replica-serve-stale-data yes #當從庫同主庫失去鏈接或者複製正在進行,從機庫有兩種運行方式:1) 若是replica-serve-stale-data設置爲yes(默認設置),從庫會繼續響應客戶端的請求。2) 若是replica-serve-stale-data設置爲no,除去指定的命令以外的任何請求都會返回一個錯誤"SYNC with master in progress"

replica-read-only yes #是否設置從庫只讀;必定要是隻讀

repl-diskless-sync no #是否使用socket方式複製數據,目前redis複製提供兩種方式,disk和socket,若是新的slave連上來或者重連的slave沒法部分同步,就會執行全量同步,master會生成rdb文件,有2種方式:disk方式是master建立一個新的進程把rdb文件保存到磁盤,再把磁盤上的rdb文件傳遞給slave,socket是master建立一個新的進程,直接把rdb文件以socket的方式發給slave,disk方式的時候,當一個rdb保存的過程當中,多個slave都能共享這個rdb文件,socket的方式就是一個個slave順序複製,只有在磁盤速度緩慢可是網絡相對較快的狀況下才使用socket方式,不然使用默認的disk方式


repl-diskless-sync-delay 5 #diskless複製的延遲時間,設置0爲關閉,一旦複製開始尚未結束以前,master節點不會再接收新slave的複製請求,直到下一次開始

repl-ping-slave-period 10 #slave根據master指定的時間進行週期性的PING 監測

repl-timeout 60 #複製連接超時時間,須要大於repl-ping-slave-period,不然會常常報超時

repl-disable-tcp-nodelay no #在socket模式下是否在slave套接字發送SYNC以後禁用 TCP_NODELAY,

若是你選擇「yes」Redis將使用更少的TCP包和帶寬來向slaves發送數據。可是這將使數據傳輸到slave上有延遲,Linux內核的默認配置會達到40毫秒,若是你選擇了 "no" 數據傳輸到salve的延遲將會減小但要使用更多的帶寬

repl-backlog-size 1mb #複製緩衝區大小,只有在slave鏈接以後才分配內存。

repl-backlog-ttl 3600 #屢次時間master沒有slave鏈接,就清空backlog緩衝區。

replica-priority 100 #當master不可用,Sentinel會根據slave的優先級選舉一個master。最低的優先級的slave,當選master。而配置成0,永遠不會被選舉。

requirepass foobared #設置redis 鏈接密碼

rename-command #重命名一些高危命令

maxclients 10000 #最大鏈接客戶端

maxmemory #最大內存,單位爲bytes字節,8G內存的計算方式8(G)*1024(MB)*1024(KB)*1024(Kbyte),須要注意的是slave的輸出緩衝區是不計算在maxmemory內。

appendonly no #是否開啓AOF日誌記錄,默認redis使用的是rdb方式持久化,這種方式在許多應用中已經足夠用了。可是redis若是中途宕機,會致使可能有幾分鐘的數據丟失,根據save來策略進行持久化,Append Only File是另外一種持久化方式,能夠提供更好的持久化特性。Redis會把每次寫入的數據在接收後都寫入 appendonly.aof 文件,每次啓動時Redis都會先把這個文件的數據讀入內存裏,先忽略RDB文件。

appendfilename "appendonly.aof" #AOF文件名

appendfsync everysec #aof持久化策略的配置,no表示不執行fsync,由操做系統保證數據同步到磁盤,always表示每次寫入都執行fsync,以保證數據同步到磁盤,everysec表示每秒執行一次fsync,可能會致使丟失這1s數據。

no-appendfsync-on-rewrite no在aof rewrite期間,是否對aof新記錄的append暫緩使用文件同步策略,主要考慮磁盤IO開支和請求阻塞時間。默認爲no,表示"不暫緩",新的aof記錄仍然會被當即同步,Linux的默認fsync策略是30秒,若是爲yes 可能丟失30秒數據,但因爲yes性能較好並且會避免出現阻塞所以比較推薦。

auto-aof-rewrite-percentage 100 # 當Aof log增加超過指定比例時,重寫log file, 設置爲0表示不自動重寫Aof 日誌,重寫是爲了使aof體積保持最小,而確保保存最完整的數據。

auto-aof-rewrite-min-size 64mb #觸發aof rewrite的最小文件尺寸

aof-load-truncated yes #是否加載因爲其餘緣由致使的末尾異常的AOF文件(主進程被kill/斷電等)

aof-use-rdb-preamble yes #redis4.0新增RDB-AOF混合持久化格式,在開啓了這個功能以後,AOF重寫產生的文件將同時包含RDB格式的內容和AOF格式的內容,其中RDB格式的內容用於記錄已有的數據,而AOF格式的內存則用於記錄最近發生了變化的數據,這樣Redis就能夠同時兼有RDB持久化和AOF持久化的優勢(既可以快速地生成重寫文件,也可以在出現問題時,快速地載入數據)。


lua-time-limit 5000 #lua腳本的最大執行時間,單位爲毫秒

cluster-enabled yes #是否開啓集羣模式,默認是單機模式

cluster-config-file nodes-6379.conf #由node節點自動生成和的集羣配置文件

cluster-node-timeout 15000 #集羣中node節點鏈接超時時間

cluster-replica-validity-factor 10 #在執行故障轉移的時候可能有些節點和master斷開一段時間數據比較舊,這些節點就不適用於選舉爲master,超過這個時間的就不會被進行故障轉移

cluster-migration-barrier 1 #一個主節點擁有的至少正常工做的從節點,即若是主節點的slave節點故障後會將多餘的從節點分配到當前主節點成爲其新的從節點。

cluster-require-full-coverage yes #集羣槽位覆蓋,若是一個主庫宕機且沒有備庫就會出現集羣槽位不全,那麼yes狀況下redis集羣槽位驗證不全就再也不對外提供服務,而no則能夠繼續使用可是會出現查詢數據查不到的狀況(由於有數據丟失)。

cluster-replica-no-failover no

#Slow log 是 Redis 用來記錄查詢執行時間的日誌系統,slow log 保存在內存裏面,讀寫速度很是快,所以你能夠放心地使用它,沒必要擔憂由於開啓 slow log 而損害 Redis 的速度。

slowlog-log-slower-than 10000 #以微秒爲單位的慢日誌記錄,爲負數會禁用慢日誌,爲0會記錄每一個命令操做。

slowlog-max-len 128 #記錄多少條慢日誌保存在隊列,超出後會刪除最先的,以此滾動刪除

127.0.0.1:6379> slowlog len

(integer) 14

127.0.0.1:6379> slowlog get

1) 1) (integer) 14

2) (integer) 1544690617

3) (integer) 4

4) 1) "slowlog"

127.0.0.1:6379> SLOWLOG reset

OK
```

 

### redis 高可用與集羣

雖然Redis能夠實現單機的數據持久化,但不管是RDB也好或者AOF也好,都解決不了單點宕機問題,即一旦redis服務器自己出現系統故障、硬件故障等問題後,就會直接形成數據的丟失,所以須要使用另外的技術來解決單點問題。

## 配置reids

主備模式,能夠實現Redis數據的跨主機備份。

程序端鏈接到高可用負載的VIP,而後鏈接到負載服務器設置的Redis後端real server,此模式不須要在程序裏面配置Redis服務器的真實IP地址,當後期Redis服務器IP地址發生變動只須要更改redis 相應的後端real server便可,可避免更改程序中的IP地址設置。

![1545808564292](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1545808564292.png)

### Slave 主要配置

Redis Slave 也要開啓持久化並設置和master一樣的鏈接密碼,由於後期slave會有提高爲master的可能,Slave端切換master同步後會丟失以前的全部數據。

一旦某個Slave成爲一個master的slave,Redis Slave服務會清空當前redis服務器上的全部數據並將master的數據導入到本身的內存,可是斷開同步關係後不會刪除當前已經同步過的數據。

#### 命令行配置

當前狀態爲master,須要轉換爲slave角色並指向master服務器的IP+PORT+Password

```shell
192.168.7.104:6379> REPLICAOF 192.168.7.103 6379
OK
192.168.7.104:6379> CONFIG SET masterauth 123456
OK
```

 

 

 

 

##### Redis cluster 主從架構

Redis cluster的架構雖然解決了併發的問題,可是又引入了一個新問題,每一個Redis master的高可用如何解決?

![1545817241194](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1545817241194.png)

 

 

 

 

# Docker容器

- 容器:一臺計算機的主要目標不是爲了運行操做系統而是運行某一特定的程序;將用戶空間隔離開,讓彼此間不互相干擾稱爲容器
- 容器是爲了隔離運行進程
- 容器是動態化的
- 容器只是進程而已;可是與當前系統中的其餘進程隔離開來
- 用戶空間:程序運行時所處的位置
- 空間名稱:名稱空間用來封裝一個全局資源在一個抽象層上從而使得可以進行切分

```shell
IPC;同一主機上的進程間通信的隔離
Network;網絡的空間名稱機制;主要用於隔離網絡設備;網絡協議棧;網絡接口,端口
Mount;根文件系統;
PID;進程
User;模擬用戶的;將宿主機中的普通用戶虛擬成爲一個用戶空間的root用戶
UTS;虛擬主機名;使得每一個用戶空間都有本身的主機名稱
Cgroup;把CPU;內存;IO 劃分爲塊 有效的分配給每個用戶控件
```

 

docker在組織容器時一個用戶空間(一個容器)只用來運行一個進程及其子進程

啓動一個程序就至關於啓動一個容器;每個進程都有本身單獨的用戶空間;

程序及其程序所依賴的東西都在同一容器內

 

### Docker的架構

C/S架構;

- C端**docker Client** : docker build docker pull docker run

- S端**docker Daemon** : 容器運行時環境(containers)和鏡像存儲環境(images)

- 遠程倉庫**docker Registry**:在docker daemon在本地倉庫找不到合適的鏡像時,則上遠程倉庫找對應的鏡像文件

- 默認指向官方倉庫:docker Hub

- docker客戶端和服務端經過HTTP/HTTPS協議通信

- 基於共享內存通信;默認C/S端都在同一主機上

- 基於RESTful風格的API提供服務 所以docker 內部將其全部管理的組件視爲對象

- 同一個對象被抽象成資源的概念 Resource Type
- Object:
- docker images
- docker Container
- docker network
- docker Volume

 

 

 

 

## docker安裝

1. 有兩種方式安裝

1.1

```shell
cd /etc/yum.repos.d/
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce
```

 

安裝時可能會報錯:yum倉庫有問題,yum倉庫問題解決辦法

```
解決辦法1:
yum install http://vault.centos.org/centos/7.3.1611/extras/x86_64/Packages/container-selinux-2.9-4.el7.noarch.rpm

解決辦法2:阿里yum倉庫
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

注意:在/etc/yum.repos.d目錄下執行
```

### docker加速

國內使用docker建議使用鏡像加速:阿里爲例

```
打開 dev.aliyun.com網站
登錄,進入控制檯
搜索容器鏡像服務,進入以後點擊鏡像加速器
複製加速地址
mkdir /etc/docker
vim /etc/docker/daemon.json

{
"registry-mirrors": ["https://0z1c5swq.mirror.aliyuncs.com"]
}

systemctl daemon-reload
systemctl start docker
```

 

查看docker詳細信息:docker version

 

 

## docker經常使用操做

在容器外部中止/刪除一個容器:docker stop/rm 容器名稱

啓動容器:dcoker start 容器名稱

中止容器:docker stop

刪除容器:docker rm

建立容器:docker run 建立完當即啓動

​ docker create 建立完不啓動

鏡像相關:docker images

​ 獲取鏡像:docker images pull 鏡像名稱:版本號(無需特地下載;安裝鏡像時沒有會自動下載)

容器相關:docker

 

 

 

 

兩類資源container(容器;運行進程的);images(鏡像資源)

1. 有兩種操做方式
1. 傳統方式 全部的命令混雜在一塊兒;
2. 新方式:各自有各自的子命令
1. 如:容器相關的使用docker container 鏡像相關的使用docker images

### docker images

```
images:

docker images --help
docker image pull 從遠程下載一個鏡像
docker image push 將本地鏡像推送到遠程
docker image rm = docker rmi 刪除鏡像
docker image tag 爲鏡像打標籤
docker image inspect 鏡像:版本號 查看鏡像詳細信息
可查看容器默認運行的程序;在"Cmd":{ 欄裏面
```

### docker container

```
container

docker container -h 幫助
docker container create 建立容器
docker container start/stop/restart 啓動/中止/重啓容器
docker container rm 刪除容器
docker container rename 重命名
docker container pause/unpause 暫停/繼續
docker container ps 查看已經啓動的容器信息/查看容器狀態
-a/--al查看全部容器信息
```

 

### 容器狀態

running;運行態

stopped;中止態

paused;暫停態

created;建立態:剛建立好但尚未啓動

deleted;刪除態:曾經有但如今被刪除了

![1546745376291](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1546745376291.png)

 

## 容器建立和選項:

```
建立鏡像時本地若是沒有鏡像會自動在Registry上獲取;但也能夠手動獲取
注意將防火牆停掉!!!
此處以redis爲例!!!

搜索鏡像:doceker search redis
下載鏡像:docker pull redis (不加任何標籤默認是latest最新版)
能夠在dockerhub.com裏搜索 帶alpine的是精簡版的
docker pull redis:4-alpine
查看本地鏡像:docker image ls
刪除本地鏡像:docker image rm 鏡像名稱
查看鏡像詳細信息:docker image inspect redis:4-alpine
查看容器詳細信息:docker container inspect

能夠不用下載;默認本地沒有此鏡像則默認去網上下載

建立容器:docker create 建立不啓動 docker run 建立完當即啓動
基於此鏡象建立容器:docker run = docker container run
docker container run -it --name c1 centos:7 /bin/bash
-i 表示交互式模式 -t表示附加一個終端 -c1是此容器的名稱 centos:7是指定的鏡像 /bin/bash 指定默認運行的程序
默認運行此進程的話用exit退出 則容器關閉

查看全部處於運行狀態的容器信息/查看容器狀態:docker container ps
(加上--all選項查看是全部容器)

只有終止ID爲1的進程容器纔會中止 ps aux查看
```

#### docker run 選項

```
建立docker選項:
docker run --help 注意:全部選項必須寫在指定的鏡像前面

docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
[COMMAND]不運行鏡像內部默認要運行的程序
[ARG..]是傳遞給命令的參數
[OPTIONS]
-t,--tty 爲容器附加一個僞終端
-i, --interactive 進入交互式接口模式
默認命令運行shell時纔有必要加-it
--name 若是指定名稱則容器必定不可同名
-h/--hostname 指定主機名
--network 指定網絡接口;指定網絡模式
宿主機上執行docker network ls 查看網絡名稱接口
容器網絡地址默認放在了docker0橋身上 172.17網段
--rm 容器中止則自動刪除與-d選項互相抵觸
-d,--detach 後臺運行容器
```

 

#### docker exec

docker nontainer exec = docker exec

在宿主機上執行後臺容器的命令/

```shell
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
CONTAINER 指定容器名字或id
COMMAND 指定運行的命令
[ARG...] 指定命令參數
[OPTIONS]選項(若是使用shell命令行則需加-it)
-d 後臺執行
-e 設置環境變量
-t 爲容器附加一個僞終端
-i 進入交互式接口模式
-u 用戶名或UID(格式:< nameluid>[:<grouplgid>1)
-w 容器內的工做目錄
示例:docker container exec -it redis /bin/sh
注意此時用exit退出容器不會終止容器;只有終止ID爲1的進程容器纔會中止
ps aux查看(在容器內部運行)
示例二:docker container exec redis netstat -tnl
直接返回命令結果 不進入到交互式接口
```

注意:守護進程運行在某一個容器中並且做爲此容器中id號爲1的進程時;此進程必需要運行在前臺;不然容器啓動不起來

 

#### docker logs

```shell
docker container logs --help
docker container logs [OPTIONS] CONTAINER

獲取容器日誌
docker 日誌默認沒有計入到文件中

```

#### docker stats

```
docker container stats --help
顯示容器運行時對資源的佔用狀況
```

#### docker top

```shell
docker container top --help
docker container top CONTAINER [ps OPTIONS]
顯示對應容器內運行的全部進程的相關信息
```

#### docker attach

```
docker attach [OPTIONS] CONTAINER
適用在被剝離終端的容器;若有一個默認進程是/bin/bash的 用[CTRL+P再加Q]剝離終端然後用docker attach 容器名稱附加一個終端
--detach-keys string Override the key sequence for detaching a container
--no-stdin Do not attach STDIN
--sig-proxy Proxy all received signals to the process (default true)

```

 

#### 總結經常使用操做

```
docker search: 在dockerHub中搜索鏡像
docker pull: 在dockerhub中下載鏡像
docker images: 列出本地鏡像
docker create: 建立一個新的容器
docker start: 啓動一個或多箇中止的容器
docker run: 在新容器中運行一個命令
docker attach: 附加到正在運行的容器上
docker ps: 列出容器
docker logs: 獲取容器的日誌
docker restart: 重啓一個容器
docker stop: 中止一個或多個正在運行的容器
docker kill: 殺死一個或多個正在運行的容器
docker rm: 刪除一個或多個容器
```

 

#### 快捷鍵

```
CTRL + ] 剝離終端
CTRL + p 而後 CTRL +q 剝離終端
docker attach [OPTIONS] CONTAINER 恢復終端
```

 

## Docker images

1. Docker鏡像含有**啓動容器**所須要的**文件系統**及其內容.所以,其用於**建立並啓動docker容器**
2. 採用分層構建機制,最底層爲bootfs,其之位rootfs
3. bootfs:用於系統引導的文件系統,包括bootloader和kernel,容器啓動完成後會被卸載以 節約內存資源;
4. rootfs:位於bootfs之上,表現爲docker容器的根文件系統;
1. 傳統模式中,系統啓動之時,內核掛載rootfs時會首先將其掛載爲「只讀」模式,完整性自檢完成 後將其從新掛載爲讀寫模式;
2. docker中,rootfs由內核掛載爲「只讀」模式,然後經過「聯合掛載 」技術額外掛載一個「可寫」層

 

- 位於下層的鏡像稱爲父鏡像(parent image),最底層的稱爲基礎鏡像(base image)
- 最上層爲「可讀寫」層,其下的均爲「只讀」層

 

### Docker Registry
- 啓動容器時,docker daemon會試圖從本地獲取相關的鏡像;本地鏡像 不存在時,其將從Registry中下載該鏡像並保存到本地;
- The Registry is a stateless, highly scalable server side application that stores and lets you distribute Docker images.

 

 

### Docker Hub特性

- Image Repositories **鏡像倉庫**
- 從社區和官方庫中查找和提取圖像,並管理、推送和提取您能夠訪問的私有圖像庫。
- Automated Builds **自動構建功能**
- 當您更改源代碼存儲庫時,自動建立新映像。
- Webhooks **基於web的觸發器;基於web的鉤子**
- 做爲自動構建的一個特性,webhook容許您在成功地推送到存儲庫以後觸發操做。
- Organizations
- 建立工做組來管理對映像存儲庫的訪問。
- GitHub and Bitbucket Integration
- 將Hub和Docker images添加到當前工做流中。

 

## 在dockerhub上建立本身的鏡像倉庫

利用以有的鏡像啓動一個容器;在容器可寫層裏面作一些簡單的修改;然後將修改結果保存爲單獨的一個層

```
先在docker hub上建立好帳戶而後建立倉庫

docker container commit -h
docker container commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
選項:-p 製做鏡像時暫停容器
-a 製做鏡像時指明做者
-c 從新指定容器運行時默認運行的程序
```
```
製做鏡像:docker container commit c1 zhangqiang3715/zq:v0.1
c1是本地容器 基於本地容器建立的鏡像層 zhangqiang3715是項目名/zq是倉庫名v0.1是標籤
注意!!!項目名稱和倉庫名必定要與dockerhub上的保持一致
製做鏡像範例2:docker container commit -p -a "zhangqiang<444198655@qq.com>" -c "CMD ['/bin/httpd -f -h /data/web/html']" b1
注意沒打標籤:忘記打標籤的補救方法
1. docker image ls 查看鏡像ID
2. docker image tag ID zhangqiang3715/zq:v0.2
```
```
docker login 登錄到dockerhub上
docker image push zhangqiang3715/zq:v0.1 將剛剛製做好的鏡像推送到dockerhub上
```

 

 

## Docker network

- 虛擬橋接式網絡
- 隔離橋:只能在同一橋上的個主機間進行通信並且地址要在同一網段上
- 僅主機橋:
- 路由橋:
- NAT橋:
- docker的四種網絡

1. 橋網絡:`bridge`;
1. docker0 這個NAT橋
2. 共享橋;共享接口;
1. 能夠理解爲聯盟式網絡;容器之間共享網絡
3. host網絡;共享宿主機的網絡及其網絡名稱空間
1. 開放式容器
4. none網絡;無需用到網絡類型;封閉式網絡;只有127接口

 

 


```
docker network ls 查看網絡類型列表
docker network inspect bridge 查看bridge網絡詳細信息
--add-host www.heizq.com:172.17.0.1 地址解析;可重複使用以生成多條記錄
示例:docker run --name bbox2 -it --rm --hostname bbox --add-host www.heizq.com:172.17.0.1 busybox

```

## 解決外部不能訪問容器方式

 

docker虛擬機上監聽的端口外部是不能訪問的;

- 解決方式:

- 共享宿主機網路

- --add-host

- DNAT

- 外部訪問宿主機的時候DNAT到容器上來

- ```shell
iptables -t nat -A PREROUTING -d 宿主機對外的IP -p tcp|udp --
```

- 此方式解決過於麻煩!能夠用docker -p選項

- -p選項的使用格式

- ```
-p <containerPort>
將指定的容器端口映射至主機全部地址的一個動態端口
-p <hostPort>:<containerPort>
將容器端口<containerPort>映射至指定的主機端口<hostPort>
-p <ip>::<containerPort>
將指定的容器端口<containerPort>映射至主機指定<IP>的動態端口
-p <ip>:<hostPort>:<containerPort>
將指定的容器端口<containerPort>映射至主機指定<ip>的端口<hostPort>
"動態端口"指隨機端口,具體的映射結果可以使用docker port命令或iptables -t nat -vnL 查看
-p選項是能夠重複使用屢次的
```

 

 

 

 

 

 

 

 

 

 


# Nginx

工做在應用層

對nginx來說核心功能分爲三類

http

mail

stream

奇數版本是測試版

偶數版本是正常版本

## Web server

 

 

 

 

## 如何做爲代理服務器工做

- Proxy
- HTTP
- mail
- stream (單獨的大模塊)

- 正向代理:
- 表明客戶端發請求
- 客戶端發請求時被代理
- 相似於SNAT
- 工做在應用層.TCP/IP協議棧的

- 反向代理:
- 表明服務方接收客戶端的請求
- 相似於DNAT

 

`Proxy_set_header field value`

 

 

Proxy_cache

先定義出一個緩存;而後代理再用這個緩存

​ 什麼是緩存?

 

 

配置nginx緩存功能

 

鍵;值是分開存放的 鍵放在內存中;也就是索引;值存放在磁盤中

索引就是鍵

緩存服務器IO能力必定要夠好

 

## Nginx緩存配置:

`proxy_cache_path /var/cache/nginx levels=1:2:3 keys_zone=webcache:10m max_size=2g`

- /var/cache/nginx緩存路徑
- levels=1:2:3 緩存級別
- max_size=2g 分配多大磁盤空間

 

 

 

## fastcgi

fastcgi調用變量名稱與nginx不一樣

​ 需將fastcgi變量的值傳給nginx

```shell
docker run --name fpmsrv1 -d --netwoek bridge -v /vols/phpsrv1:/appdata php:7-fpm-alpine
cd /vols/phpsrv1/

```

 

```
location ~* ^/(pm_status|ping)$ {
fastcgi_pass 172.17.0.3:9000

```

 

 

## Nginx負載均衡

- Scale Out
- 四層:nginx(stream),ipvs
- 七層:nginx(http_upstream)

 

- session保持
- session sticky
- cookie
- session replication cluster
- session server

 

 

### 四層負載均衡

簡介

```
以mysql爲例反向代理和負載均衡是如何工做的
本身不對報文作任何解析,只做爲一個通道
相似於DNAT
注意是steam上下文而不是http上下文
```

 

啓動容器 注意啓兩個

```shell
docker run --name db1 -d -e "MYSQL_ROOT_PASSWORD=magedu.com" -v /vols/db1:/var/lib/mysql mysql:5.7
```

鏈接容器並啓動mysql

```shell
docker exec -it db1 /bin/sh
# mysql -pmagedu.com
```

Nginx配置(若是是長鏈接機制建議使用least_conn)

```shell
stream {
upstream dbsrvs {
server 172.17.0.5:3306;
server 172.17.0.6:3306;

server {
listen 3306;
proxy_pass 172.17.0.6:3306
}
}
```

測試驗證

```

```

 

 

## Nginx優化

實現nginx高併發Linux內核優化

 

跨機房調度是SLB

全局負載均衡調度器GSLB

```
fs.file-max=999999
表示單個進程較大的能夠打開的句柄數
net.ipv4.tcp_reuse = 1
表示容許讓TIME_WAIT狀態的socket從新用於新的TCP連接
這對服務器來講意義重大,由於總有大量TIME_WAIT狀態的連接存在
net.ipv4.tcp_keepalive_time = 600
當keepalive啓動時,TCP發送keepalive消息的頻度;默認是2小時;建議不調整
net.ipv4.tcp_fin_timeout = 30
當服務器主動關閉連接時,socket保持
net.ipv4.tcp_max_tw_buckets = 5000
默認是8000
net.ipv4.ip_local_port_range =1024 65000
定義UDP和TCP連接本地端口取值範圍
net.ipv4.tcp_rmem = 10240 87380 12582912
定義了TCP接受緩存的最小值,默認值,最大值
net.ipv4.tcp_wmem = 10240 87380 12582912
定義了TCP發送緩存的最小值,默認值,最大值


```

進程數量調整

單進程鏈接數量調整

啓用壓縮功能

若是啓用ssl會話建議ssl使用共享的

必要時單連接限速

 

 

 

 

# Tomcat

有些應用程序無需安裝客戶端

一個Tomcat 大概可以實現 3/5百的併發請求

應用程序:

* C/S 客戶端與服務端相對應
* B/S 客戶端無需安裝對應的客戶端程序
* 瀏覽器

 

* 前端開發
* 客戶端運行
* 語言:JS
* 後端開發
* 服務器端運行
* 語言:php(適用於中小規模企業,業務結構不復雜的);jsp;c# .net

 

nio bio nio速度更快;

 

fpm

* 軟件架構模式
* 分層架構:表現層,業務層,持久層,數據庫層
* 事件驅動架構:分佈式異步架構,調度解耦
* 微內核架構:即插件式架構
* 類如 nginx
* 微服務架構:API REST-based,application REST-based, 中心化消息
* 每個模塊都是一個網絡上的模塊,都須要監聽
* 基於空間的架構:雲架構

 

J2SE J2ME J2EE

j2:

* SE:Standard Edition (標準版)

* EE:Enterprise Edition(企業版)

* ME:Mobile Edition(移動版) 沒人用

 

 

## JAVA 技術體系

## 什麼是JDK

JAVA標準版就叫 JDK

JDK由JAVA編程語言;JAVA的各類調試工具開發工具;以及JRE組成

JRE:JAVA運行時環境

 

 

![1547888656644](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1547888656644.png)

 

 

## 什麼是JSP

 

全稱:Java Server Page; Java 服務器頁面

由 Servlet提供基礎架構

JSP屬於java 2 EE中的組件

 

.jsp --> Jasper --> .java --> JavaC --> .class --> Servlet

 

Tomcat 基礎

1. 運行在JVM之上,而後才能監聽套接字
2. tomcat對外監聽的有三種協議 http/https/ajp (apache jserv protocol 僅專用於apache內部的協議)
3. 除了本身監聽套接字以外並不能服務於用戶的請求(部署在tomcat之上的網頁站點程序文件才能夠)
4.

 

 

 

反代

在使用Nginx進行反代時 客戶端與Nginx用HTTPS進行通信而Nginx與Tomcat進行通信時用HTTP

 

 

 

 

 

 

 

HotSpot JVM JAVA虛擬機

 

一次編寫 處處執行

| | Java code(.java) | |
| :-----: | :-----------------------: | :--: |
| | ↓ | |
| | javac compiler | |
| | ↓ | |
| | Byte Code(.class)(類文件) | |
| | ↓ | |
| JVM | JVM | JVM |
| ↕ | ↕ | ↕ |
| Windows | Linux | Mac |

 

 

 

 

 

JSP是什麼

java server page

* applet

CGI

* servlet

 

 

Tomcat 版本的使用是由程序員定義的

監聽http與https端口;能夠直接解析

 

JDK+Tomcat

 

Tomcat默認監聽8080端口

Tomcat本質就是java 2 EE的不完整實現

 

 

### 部署 JDK

open JDK centos 7中yum倉庫中直接提供

若是想要下載最新的JDK 本身上網搜索 oracle jdk

#### open JDK 部署

yum list java* 列出open JDK的各個版本

3個版本能夠同時安裝

alternatives 能夠設置默認版本

 

#### oracle jdk

rpm -ivh jdk-8u191-linux-x64.rpm

安裝目錄

/usr/java/

測試安裝成功與否

bin/java -version

 

 

## Tomcat 部署

yum list all tomcat*

```shell
yum install tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp
```

 

 

 

## Tomcat server

 

 

 

![1547447049756](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1547447049756.png)

 

如何區別虛擬主機:最簡單方式是主機名;(需設置默認虛擬主機名)

 

部署是

 

 

 

## 配置文件

主配置文件:server.xml

web.xml

 

 

 

 

日誌必須轉爲JSON格式纔可以存儲下來

 

 

 

默認的羣集配置:

```shell
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">

<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>

<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>

<SenderclassName="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<TransportclassName="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>

<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>

<Cluster ListenerclassName="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener">
<Cluster ListenerclassName="org.apache.catalina.ha.session.ClusterSessionListener">
</Cluster>
```

 

 

 

 

## session server

此處以memcached爲例 但更推薦使用redis

 

存儲系統種類繁多

* session manager須要專門添加

存儲系統性能高

* 可以存儲K/V
* Reids;Memcached

存儲系統要有冗餘能力

 

 

Cache:無持久能力

* memcached

Store:持久是必備功能

* redis(aof機制)

 

數據流式化

 

 

### 經常使用優化配置

 

 

# JVM

java程序在執行時可以自動內存回收

主要由兩部分組成

1. 執行引擎

2. class loader


![1547543909631](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1547543909631.png)

堆時用來放置各類對象

 

 

* 自動內存回收
* 回收方式
* 增量
* 分代:新生代(Eden Spece);老年代(Old Gen);持久代(1.7以後取消了)
* 新生代:Eden;Survivor(存活區)
* Survivor分爲:S1;S0; from,to
* 回收機制
* 串行 回收時一個一個的回收
* 並行 多個核心一塊兒工做回收(通常來講線程不該該超過CPU核心線程)
* 併發

 

回收新生代時叫小GC

回收老年代時叫大GC

通常在回收老年代時也會回收新生代叫Full GC

 

垃圾回收算法:

* 新生代:
* Serial 串行回收
* ParNew 新生代並行回收
* Parallel Scavenge:吞吐量
* 老年代
* Serial Old
* Parallel Old
* CMS (Concurrent Mark Sweep):以得到最短回收停頓時長爲目標,是互聯網站點服務端的B/S系統上較佳的回收算法
* 標記 -> 清除
* 整個過程分爲四個階段
* 初始標記
* 併發標記
* 從新標記
* 併發清楚
* G1 Garbage First
* 並行和併發,分代手機,空間整合,可預測的停頓

JVM頻繁使用垃圾回收意味着什麼?

內存過小(堆內存空間)

 

## 如何調內存

![1547545980075](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1547545980075.png)

內存分配參數:

* -Xmx:堆內存(新生代和老年代)的最大空間;
* -Xms:初始內配內存空間;
* -XX:NewSize:新生代空間大小
* -Xms-(-XX:NewSize)
* -XX:MaxNewSize:新生代的最大空間;
* -Xmx- (-XX:MaxNewSize)
* -XX:NewRatio:新生代除以老年代的值
*

![1547546301965](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1547546301965.png)

 

 

# Zabbix監控

監控Java服務時 會有一箇中間代理層 Java gatway

 

 

 

##

最小化安裝系統安裝如下經常使用包

```
yum install vim iotop bc gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel zip unzip zlib-devel net-tools lrzsz tree ntpdate telnet lsof tcpdump wget libevent libevent-devel
```

 

 

## 安裝配置Zabbix

### 編譯安裝:

 

#### 安裝zabbix server端

安裝依賴包:

```
yum install gcc libxml2-devel net-snmp net-snmp-devel curl curl-devel php php-bcmath php-mbstring mariadb mariadb-devel –y
```


1. 配置數據庫
```shell
[zabbix-mysql]# yum install mariadb mariadb-server
[zabbix-mysql]# systemctl start mariadb
[zabbix-mysql]# mysql_secure_installation mysql
[zabbix-mysql]# mysql
MariaDB [(none)]> show databases;
MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin; (建立一個數據庫zabbix 使用utf-8編碼)
MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost identified by 'centos'; 此步驟是受權數據庫受權用戶及設置密碼 zabbix@表明用戶 localhost表明地址 'centos'密碼
```

2. 測試鏈接數據庫

```
[root@zhangqiang zabbix-server]# yum install mysql -y
[root@zhangqiang zabbix-server]# mysql -uzabbix -p394355 -h192.168.31.41
注意:若是鏈接不了 有多是防火牆的問題:
關閉防火牆 systemctl stop firewalld.service
永久關閉防火牆 systemctl disable firewalld.service

```

3. 開始編譯安裝

```
[root@zhangqiang zabbix-server]# cd /usr/local/src/
[root@zhangqiang zabbix-server]# tar -xvf zabbix-4.0.1.tar.gz
若是選擇開啓Java 即監控Java服務 則需安裝java-1.8.0(ubutun系統安裝openjdk-1.8.0)
[root@zhangqiang zabbix-server]# ./configure --prefix=/apps/ --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --enable-java
[root@zhangqiang zabbix-server]# make && make install
注意在/usr/local/src/zabbix-4.0.5下執行
若是隻安裝agent則只須要執行./configure --enable-agent
```

4. 編譯zabbix安裝時報錯解決辦法:

```
錯誤: checking for libevent support... no
configure: error: Unable to use libevent (libevent check failed)
解決: yum install libevent-devel -y

錯誤: configure: error: MySQL library not found
解決: #yum install mysql-devel

錯誤: configure: error: Jabber library not foun
解決: #wget http://iksemel.googlecode.com/files/iksemel-1.4.tar.gz
下載完成後解壓、配置、安裝:
tar zxvf iksemel-1.4.tar.gz
cd iksemel-1.4
configure
make
make install
以後對zabbix進行configure仍是會遇到這個問題,那麼將jabber目錄指定便可:#./configure --enable-server --enable-agent --with-mysql --with-net-snmp --with-jabber=/usr/local/ --with-libcurl

錯誤: configure: error: Not found curl Library
解決: #yum install curl-devel (此項未經測試)

錯誤: configure: error : Not found NET-SNMP library
解決: yum install net-snmp-devel

錯誤: error: Invalid Net-SNMP directory - unable tofind net-snmp-config
解決: yum install net-snmp-devel

錯誤: configure: error: Jabber library not found
解決: #yum install iksemel-devel -y 便可,

錯誤: configure: error: LIBXML2 library not found
解決: #yum install libxml2-devel -y

錯誤: configure: error: unixODBC library not found
解決: #yum install unixODBC-devel -y

錯誤: configure: error: Invalid OPENIPMI directory -unable to findipmiif.h
解決: #yum install OpenIPMI-devel

錯誤: configure:error: Unable to find"javac" executable in path
解決: yum install java-devel -y

錯誤: configure: error: Curl library not found
解決: # yum install curl-devel –y

錯誤: configure: error: SSH2 library notfound
解決: yum install -y libssh2-devel
```

 

5. 導入數據庫

```
#先導入此文件,若是作zabbix代理服務器,則只導入此文件便可

[root@zabbix-server zabbix-4.0.5]# mysql -uzabbix -pcentos -h192.168.31.41 zabbix< database/mysql/schema.sql
[root@zabbix-server zabbix-4.0.5]# mysql -uzabbix -pcentos -h192.168.31.41 zabbix< database/mysql/images.sql
[root@zabbix-server zabbix-4.0.5]# mysql -uzabbix -pcentos -h192.168.31.41 zabbix< database/mysql/data.sql

```

6. 複製啓動腳本

```shell
[root@zabbix-server zabbix-4.0.5]# cp /usr/local/src/zabbix-4.0.3/misc/init.d/fedora/core/zabbix_server /etc/init.d/
[root@zabbix-server zabbix-4.0.5]# cp /usr/local/src/zabbix-4.0.3/misc/init.d/fedora/core/zabbix_agentd /etc/init.d/

```

7. 更改啓動腳本

```
vim /etc/init.d/zabbix_server
# Zabbix-Directory
BASEDIR=/apps/zabbix(更改成安裝路徑)

# PID file
PIDFILE=/apps/zabbix/$BINARY_NAME.pid

```

8. 更改zabbix_server.con配置文件

```
cd /apps/zabbix/etc
vim /apps/zabbix/etc/zabbix_server.conf
更改LogFile路徑爲/apps/zabbix/zabbix_server.log
將Option:PodFile下的PidFile取消註釋並更改路徑爲PidFile=/apps/zabbix/zabbix_server.pid
將socketDir=取消註釋並更改成socketDir=/apps/zabbix
將DBHost=localhost更改成MySQL服務器地址
將DBPassword密碼更改成對應的密碼
將DBPort端口更改成3306
```

9. 建立用戶

```
[root@zabbix-server zabbix-4.0.5]# useradd zabbix -s /sbin/nologin 建立不能登錄的zabiix用戶
[root@zabbix-server zabbix-4.0.5]# chown zabbix.zabbix /apps/zabbix/ -R 受權
```

10. 啓動zabbix server

```shell
[root@zabbix-server]# /etc/init.d/zabbix_server start 啓動
ss -tnl查看是否啓動

如啓動不成功且沒有日誌文件 用-c強制指定配置文件
/apps/zabbix/sbin/zabbix_server -c /apps/zabbix/etc/zabbix_server.conf
```

11. 配置web界面/解決報錯

```
[root@zabbix-server]# yum install httpd -y
[root@zabbix-server]# mkdir /var/www/html/zabbix
[root@zabbix-server]# cp -a /usr/local/src/zabbix-4.0.3/frontends/php/* /var/www/html/zabbix
[root@zabbix-server]# systemctl start httpd
注意:若是不能訪問則有多是防火牆問題;
解決方法: systemctl stop firewalld.service 關閉firewalld防火牆
systemctl disable firewalld.service 永久關閉防火牆

解決報錯:
1. yum install php-gettext php-session php-ctype php-xmlreader php-xmlwriter php-xml php-net-socket php-gd php-mysql -y
yum -y install php-ldap
2.vim /etc/php.ini
post_max_size = 8M更改成16M 上傳文件大小
max_execution_time = 30更改成300 最大指定時間
max_input_time = 60更改成300 最大輸入時間
date.timezone = Asia/Shanghai 時區設定爲上海

配置完成重啓httpd
```

12. 默認用戶名是Admin 密碼是zabbix(注意大小寫)

13. 更改語言爲中文:依次點擊Administration --> Users --> Admin

14. 若是web界面出現亂碼的解決辦法

```
注意:若是web界面裏面有亂碼的解決辦法
在Windows的控制面板中複製字體 上傳到服務器上
/var/www/html/ fonts 上傳到此處
cd .. 切換到上級目錄
grep "DejaVuSans" ./* -R
vim ./include/defines.inc.php 將此文件內的原來的文字名稱更改成本身剛剛上傳的名稱
```

15. server端也能夠監控本身 此處是server服務器上的agent配置

```
更改agent參數;server端也能夠監控本身,但server端中的agentd.conf更改的參數較少
vim /apps/zabbix/etc/zabbix_agentd.conf
LogFile= 日誌文件路徑
Server= zabbix_server的IP地址 如本機是server端則能夠不作修改(被動模式)
StartAgents=3 取消註釋(至少一個) 是agent進程起來會先起來幾個進程作數據的收集
ServerActive=IP地址 主動模式下是誰
Hostname= 在zabbix_server裏面用於區分監控主機的值 注意:必須保留不能重複;(web界面的主機名稱必須和此處的相同 通常設置爲本機的IP地址)
```

16. ```
vim /etc/init.d/zabbix_agentd

\# Zabbix-Directory

BASEDIR=/apps/zabbix/ 啓動腳本的路徑 將此處路徑更改成裝路徑
```

17. 建立啓動zabbix_server啓動腳本

```
vim /etc/init.d/zabbix_server

# Zabbix-Directory
BASEDIR=/apps/zabbix/ 注意:只更改這也能夠但注意必定要有後面的/

# Full Binary File Call
FULLPATH=/apps/zabbix/sbin/zabbix_server

start() {
if [ $RUNNING -eq 1 ]
then
echo "$0 $ARG: $BINARY_NAME (pid $PID) already running"
else
action $"Starting $BINARY_NAME: " /apps/zabbix/sbin/zabbix_server -c /apps/zabbix/etc/zabbix_server.conf
touch /var/lock/subsys/$BINARY_NAME
```

 

 

 

#### zabbix_agent安裝配置

```
將源碼包上傳至/usr/local/src/下

安裝開發包組 yum install gcc libxml2-devel net-snmp net-snmp-devel curl curl-devel php php-bcmath php-mbstring mariadb mariadb-devel –y

解壓RPM包 tar -xvf zabbix-4.0.3.tar.gz

開始編譯安裝 ./configure --prefix=/apps/zabbix --enable-agent
```

 

1. 更改agent配置文件

```
vim /apps/zabbix/etc/zabbix_agentd.conf
PidFile=/apps/zabbix/zabbix_agentd.pid pid路徑更改成安裝目錄下
LogFile=/apps/zabbix/zabbix_agentd.log 日誌文件路徑更改成安裝目錄下
DebugLevel=3 Debug模式打開 取消註釋
Server=127.0.0.1 若是是被動模式則無需更改默認127.0.0.1 如是主動則更改成對應的server服務器IP
ListenPort=10050
ListenIP=0.0.0.0
StartAgents=3 agent事先開啓的進程數 至少爲1
Hostname=192.168.122.129 必定要更改成本機IP 或保證主機名的惟一性
Timeout=30 超時時長 最長30秒
UnsafeUserParameters=1 是否支持特殊符號 1表示支持

grep "^[a-Z]" zabbix_agentd.conf 查看更改哪些配置
```

2. 拷貝啓動腳本

```
cp /usr/local/src/zabbix-4.0.3/misc/init.d/fedora/core/zabbix_agentd /etc/init.d/ 拷貝啓動腳本
```

3. 建立用戶

```
useradd zabbix -s /sbin/nologin 建立用戶
chown zabbix.zabbix /apps/zabbix/ -R 受權用戶

```

4. 更改啓動腳本

```
[root@zabbix-web1 etc]# vim /etc/init.d/zabbix_agentd
\# Zabbix-Directory
BASEDIR=/apps/zabbix/ 啓動腳本的路徑 將此處路徑更改成裝路
```

 

#### zabbix get命令

若是是編譯安裝的話 在編譯安裝目錄的/bin下 如:/apps/zabbix/bin下

```
將其拷貝至/usr/bin下
cd /apps/zabbix/bin
cp zabbix_get /usr/bin/
zabbix_get -h 獲取幫助
-s ip地址 指定主機 -p 10050指定端口(默認10050) -k "system.cpu.load[all,ang1]"(例子 cpu 還有:agent.ping )指定監控項

```

安裝文件詳解

```
bin 放可執行程序的
etc 放配置文件的
sbin 放zabbix_agentd和zabbix_server
share 後面放腳本時放在這裏
```

 

 

 

 

 

## 監控服務:TomCat

什麼是java gateway?

答:server想監控java服務 會先向Java gateway會發起採集數據的請求 說我要監控或採集莫一個主機的Java監控項 這個就是java gateway java gateway至關因而個代理 會將監控java服務的請求轉發到後端java服務(JMX-12345)

 

在zabbix-proxy上安裝javagateway

 

 

 

##### 安裝JDK / 配置JDK環境

下載源碼包到/apps目錄裏

```
[root@zabbix-web1 apps]# tar xvf jdk-8u191-linux-x64.tar.gz 解壓
[root@zabbix-web1 apps]# ln -sv /apps/jdk1.8.0_191 /apps/jdk 建立軟鏈接方便往後升級
```

 

修改配置文件

```
vim /etc/profile 將下面的參數所有粘貼進去
export JAVA_HOME=/usr/local/jdk
export TOMCAT_HOME=/apps/tomcat
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$TOMCAT_HOME/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
```

從新讀取配置文件

```
source /etc/profile
java -version
```

 

 

###### 配置tomcat

將tomcat解壓出來 並進入到webapps裏面建立一個目錄裏在裏面創建一個index頁面

```
[root@zabbix-web1 apps]# tar xxvf apache-tomcat-8.5.37.tar.gz
[root@zabbix-web1 apps]# cd apache-tomcat-8.5.37
[root@zabbix-web1 apache-tomcat-8.5.37]# cd webapps/
[root@zabbixweb1 webapps]# mkdir testweb
[root@zabbixweb1 webapps]# vim testweb/index.html
```

###### 啓動/中止tomcat

```
[root@zabbixweb1 apache-tomcat-8.5.37]# ./bin/startup.sh 或shutdown.sh
[root@zabbixweb1 apache-tomcat-8.5.37]# ./bin/catalina.sh run 也是啓動在業務啓動時出現問題用此方法 會顯示各類日誌 前臺方式啓動
此處咱們用的是./bin/catalina.sh start
```

###### 測試訪問

```
瀏覽器中輸入http://192.168.31.159:8080/testweb/
```

 

 

###### 配置tomcat監控參數:

```
[root@zabbix-web1 apache-tomcat-8.5.37]# vim /apps/apache-tomcat-8.5.37/bin/catalina.sh

CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote#啓用遠程監控JMX
-Dcom.sun.management.jmxremote.port=12345 #默認啓動的JMX端口號,要和zabbix添加主機時候的端口一致便可
-Dcom.sun.management.jmxremote.authenticate=false #不使用用戶名密碼
-Dcom.sun.management.jmxremote.ssl=false #不使用ssl認證
-Djava.rmi.server.hostname=x.x.x.x" #tomcat主機本身的IP地址,不要寫zabbix服務器的地址
```

 

 

 

 

 

 

 

 

## 主動zabbix proxy

* 主動模式與被動模式工做原理
* 安裝主動模式zabbix proxy
* 配置agent爲主動模式
* 添加主機並關聯模板
* 驗證數據

 

 

主動zabbix proxy

 

![1547708467491](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1547708467491.png)

 

### 主動與被動

* 這是對於zabbix agent來講的工做模式
* 被動模式就是由zabbix server向zabbix agent發出指令獲取數據,即zabbix agent被動的去獲取數據並返回給zabbixserver,zabbix server週期性的向agent 索取數據,這種模式的最大問題就是會加大zabbix server的工做量,在數百臺服務器的環境下zabbix server不能及時獲取到最新數據,但這也是默認的工做方式。
* 主動模式是有zabbix agent主動採集數據並返回給zabbix server,再也不須要zabbix serve進行干預,所以主動模式在必定程度上可減輕zabbix server的壓力。
* ![1547708565648](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1547708565648.png)

 

### Zabbix proxy

0 是主動模式

1 是被動模式

默認是被動模式

 

 

 

Proxy 主動模式配置文件:

```
# grep"^[a-Z]" /usr/local/zabbix/etc/zabbix_proxy.conf
ProxyMode=0 #0爲主動,1爲被動
Server=192.168.15.201 #zabbixserver服務器的地址或主機名
Hostname=mage_proxy#代理服務器名稱,須要與zabbixserver添加代理時候的proxy name是一致的!
LogFile=/tmp/zabbix_proxy.log
DBHost=192.168.15.203 #數據庫服務器地址
DBName=zabbix_proxy
DBUser=zabbix
DBPassword=123456
DBPort=3306
ProxyLocalBuffer=3 #已經提交到zabbixserver的數據保留時間
ProxyOfflineBuffer=24 #未提交到zabbixserver的時間保留時間
HeartbeatFrequency=60 #心跳間隔檢測時間,默認60秒,範圍0-3600秒,被動模式不使用
ConfigFrequency=5 #間隔多久從zabbixserver 獲取監控信息
DataSenderFrequency=5 #數據發送時間間隔,默認爲1秒,範圍爲1-3600秒,被動模式不使用
StartPollers=20 #啓動的數據採集器數量
JavaGateway=192.168.15.202 #java gateway服務器地址
JavaGatewayPort=10052
StartJavaPollers=20 #啓動多少個線程採集數據
CacheSize=2G #保存監控項而佔用的最大內存
HistoryCacheSize=2G #保存監控歷史數據佔用的最大內存
Timeout=30
LogSlowQueries=3000
```

 

Proxy 主動數據庫配置:

```
[root@mysql-serverzabbix-proxy-mysql-4.0.1]# pwd
/usr/share/doc/zabbix-proxy-mysql-4.0.1
#zcatschema.sql.gz | mysql-uzabbix_active-p123456 -h192.168.15.203 zabbix_proxy_active
# systemctl restart zabbix-proxy.service
```

 

客戶端安裝agent

```shell
Web 客戶端安裝zabbixagent:
# yum install gcc-y
# useraddzabbix-s /sbin/nologin
# tar xvfzabbix-4.0.1.tar.gz
# cd zabbix-4.0.1
# ./configure --prefix=/usr/local/zabbix--enable-agent
# make install
# cpmisc/init.d/fedora/core/zabbix_agentd/etc/init.d/
# vim /etc/init.d/zabbix_agentd
–22 BASEDIR=/usr/local/zabbix
```

更改配置文件:

```shell
[root@web-serverapps]# grep"^[a-Z]" /usr/local/zabbix/etc/zabbix_agentd.conf
LogFile=/tmp/zabbix_agentd.log
DebugLevel=4
Server=192.168.15.203
ListenPort=10050
ListenIP=0.0.0.0
StartAgents=3
ServerActive=192.168.15.203
Hostname=192.168.15.204
Timeout=30
UnsafeUserParameters=1
```

 

 

監控Memcache

204 安裝memcached

 

1.監控腳本內容:

注意提早安裝好nc命令

```shell
#!/bin/bash
memcached_status(){
M_PORT=$1
M_COMMAND=$2
echo -e "stats\nquit" | nc127.0.0.1 "$M_PORT" | grep"STAT $M_COMMAND " | awk'{print $3}'
}
main(){
case $1 in
memcached_status)
memcached_status $2 $3
;;
esac
}

main $1 $2 $3
```

 

調用腳本

```
[root@zabbix-web2 zabbix_agentd.conf.d]# cat all.conf
UserParameter=linux_status[*],/usr/local/zabbix/etc/zabbix_agentd.conf.d/tcp_conn_plugin.sh "$1" "$2" "$3"
UserParameter=memcache_status[*],/usr/local/zabbix/etc/zabbix_agentd.conf.d/memcache.sh "$1" "$2" "$3"
測試腳本:bash memcache.sh memcached_status 11211 curr_connections
```

```
/etc/init.d/zabbix_agentd restart
```

```
curr_connections是當前連接;其餘選項用此命令查看
echo -e "stats \nquit" | nc 127.0.0.1 11211
```

 

 

 

# HAProxy負載均衡

### 什麼是負載均衡

![1548034456717](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1548034456717.png)

* 負載均衡(Load Balance, 簡稱LB) 是一種服務或基於硬件設備等實現的高可用反向代理技術,負載均衡將特定的業務(web服務,網絡流量等)分擔給指定的一個或多個後端特定的服務器或設備,從而提升公司業務的併發處理能力,保證裏業務的高可用性,方便裏業務後期的1水平動態擴展
* https://

 

 

### 爲何使用負載均衡

* Web服務器的動態水平擴展
* 對用戶無感知
* 增長業務併發訪問及處理能力
* 解決但服務器瓶頸問題
* 節約公網IP地址
* 下降IT支出成本
* 隱藏內部服務器IP
* 提升內部服務器安全性
* 配置簡單
* 固定格式的配置文件
* 功能豐富
* 支持四層和七層,支持動態下線主機
* 性能較強
* 併發數萬甚至數十萬

 

 

### 常見有哪些負載均衡

* 軟件負載:
* 四層:
* LVS
* HAProxy
* Nginx(1.9.9以上版本)
* 七層:
* HAProxy
* Nginx
* ...
* 硬件負載:
* F5
* Netscler

### 典型應用場景

* 四層:Redis Mysqk RabbitMQ Memcache 等
* Nginx,Tomcat Apache,PHP,圖片,動靜分離,API等

 

 

## HAproxy

### 功能

* HAProxy是TCP/HTTP反向代理服務器,尤爲適合於高可用高併發環境
* 能夠針對HTTP請求添加cookie,進行路由後端服務器
* 可平衡負載至後端服務器,並支持持久鏈接
* 支持基於cookie進行調度
* 支持全部主服務器故障切換至備用服務器
* 支持專用端口實現監控服務
* 支持不影響現有鏈接狀況下中止接受新鏈接請求
* 能夠在雙向添加,修改或刪除HTTP報文首部
* 支持基於pattern實現鏈接請求的訪問控制
* 經過特定的URL爲受權用戶提供詳細的狀態信息
* 歷史版本更新功能:1.4 1.5 1.6 1.7 1.8 1.9 2.0-dev

 

## 安裝HAProxy

yum install haproxy

 

 

編譯安裝:

解決依賴關係

```
yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget ntpdate
```

必定要安裝systemd-devel

 

開始編譯安裝:

```
tar xvf haproxy-1.8.16.tar.gz && cd haproxy-1.8.16
make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
cp haproxy /usr/sbin/
```

 

建立啓動腳本

```
cat /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
```

 

 

 

## HAProxy靜態調度算法

* balance: 指明對後端服務器的調度算法,配置在listen或backend

```
balance first/static-rr
```

* 靜態算法:按照事先定義好的規則輪詢公平調度,不關心後端服務器的當前負載、連接數和相應速度等,且沒法實時修改權重,只能重啓後生效。
* static-rr:基於權重的輪詢調度,不支持權重的運行時調整及後端服務器慢啓動,其後端主機數量沒有限制
* 部署此方式需安裝socet yum install socat
* first:根據服務器在列表中的位置,自上而下進行調度,可是其只會當第一臺服務器的鏈接數達到上限,新請求才會分配給下一臺服務,所以會忽略服務器的權重設置。

## HAProxy 動態調度算法

* 動態算法:基於後端服務器 狀態進行調度適當調整,好比優先調度至當前負載較低的服務器,且權重能夠在haproxy運行時動態調整無需重啓。
* roundrobin:基於權重的輪詢動態調度算法,支持權重的運行時調整,不等於lvs 的rr,支持慢啓動即新加的服務器會逐漸增長轉發數,每一個後端backend中最多支持4095個server,此爲默認調度算法,server 權重設置 weight
* leastconn: 加權的最少鏈接的動態,支持權重的運行時調整和慢啓動,即當先後端服務器鏈接最少的優先調度,比較適合長鏈接的場景使用,好比MySQL等場景。


### HAProxy調度算法-source

* 會話保持,小型業務或這用戶源地址非集中訪問

* source:源地址hash,基於用戶源地址hash並將請求轉發到後端服務器,默認爲靜態即取模方式,可是能夠經過hash-type支持的選項更改,後續同一個源地址請求將被轉發至同一個後端web服務器,比較適用於session保持等場景。

* map-based:**取模法**,基於服務器權重的hash數組取模,該hash是靜態的即不支持在線調整權重,**不支持慢啓動**,其對後端服務器調度均衡,缺點是當服務器的總權重發生變化時,即有服務器上線或下線,都會因權重發生變化而致使調度結果總體改變。
* consistent:**一致性哈希**,該hash是動態的,**支持在線調整權重,支持慢啓動**,優勢在於當服務器的總權重發生變化時,對調度結果影響是局部的,不會引發大的變更,該算法很容易致使後端服務器負載不均衡,可是比較適合session保持。
* 只適用與訪問量較小的網站

```shell
vim /etc/haproxy/haproxy.cfg
listen web_prot_http_nodes
bind 192.168.7.101:80
mode http
balance source
hash-type consistent
log global
option forwardfor
server 192.168.7.101 192.168.7.101:8080 check inter 3000 fall 3 rise 5
server 192.168.7.102 192.168.7.102:8080 check inter 3000 fall 3 rise 5
```

 

### HAProxy調度算法-uri

URL是URI的一個子項

* uri:基於對用戶請求的uri作hash並將請求轉發到後端指定服務器

* map-based:取模法

* consistent:一致性哈希
* http://example.org/absolute/URI/with/absolute/path/to/resource.txt #URI/URL
* ftp://example.org/resource.txt #URI/URL
* /relative/URI/with/absolute/path/to/resource.txt #URI

uri: uniform resource identifier,統一資源標識符,是一個用於標識某一互聯網資源名稱的字符串

 

#### uri調度算法示例:

```
vim /etc/haproxy/haproxy.cfg
listen web_prot_http_nodes
bind 192.168.7.101:80
mode http #不支持tcp,會切換到tcp的roundrobin負載模式
balance uri
hash-type consistent
log global
option forwardfor
server 192.168.7.101 192.168.7.101:8080 check inter 3000 fall 3 rise 5
server 192.168.7.102 192.168.7.102:8080 check inter 3000 fall 3 rise 5
```

```
[root@s2 ~]# curl http://192.168.7.101/index.html
<h1>192.168.7.101</h1>
[root@s2 ~]# curl http://192.168.7.101/index.html
<h1>192.168.7.101</h1>
[root@s2 ~]# curl http://192.168.7.101/test.html
<h1>192.168.7.101-test</h1>
[root@s2 ~]# curl http://192.168.7.101/test.html
<h1>192.168.7.101-test</h1>
```

### HAProxy調度算法-url_param

只有電商

* url_param:

對用戶請求的url中的<params>部分中的參數name做hash計算,並由服務器總權重相除之後派發至某挑出的服務器;一般用於追蹤用戶,以確保來自同一個用戶的請求始終發往同一個Backend Server

 

假設url = <http://www.magedu.com/foo/bar/index.php?k1=v1&k2=v2>

則:

host = "www.magedu.com"

url_param = "k1=v1&k2=v2"

 

#### url_param調度算法示例

```
vim /etc/haproxy/haproxy.cfg
listen web_prot_http_nodes
bind 192.168.7.101:80
mode http #不支持tcp,會切換到tcp的roundrobin負載模式
balance url_param name #基於參數name作hash
hash-type consistent
log global
option forwardfor
server 192.168.7.101 192.168.7.101:8080 check inter 3000 fall 3 rise 5
server 192.168.7.102 192.168.7.102:8080 check inter 3000 fall 3 rise 5
```

 

### HAProxy 調度算法-hdr

* hdr(<name>):針對用戶每一個http頭部(header)請求中的指定信息作hash,此處由<name>指定的http首部將會被取出並作hash計算,而後由服務器總權重相除之後派發至某挑出的服務器,假如無有效的值,則會被輪詢調度
* hdr( Cookie、 User-Agent、host )

```
listen web_prot_http_nodes
bind 192.168.7.101:80
mode http
balance hdr(User-Agent)
hash-type consistent
log global
option forwardfor
server 192.168.7.101 192.168.7.101:8080 check inter 3000 fall 3 rise 5
server 192.168.7.102 192.168.7.102:8080 check inter 3000 fall 3 rise 5
```

 

 

### HAProxy 調度算法-rdp-cookie

- rdp-cookie對遠程桌面的負載,使用cookie保持會話
- rdp-cookie(<name>)

 

```
listen RDP
bind 192.168.7.101:3389
balance rdp-cookie
mode tcp
server rdp0 172.18.139.20:3389 check fall 3 rise 5 inter 2000 weight 1
server rdp1 172.18.139.21:3389 check fall 3 rise 5 inter 2000 weight 1
```

- 基於iptables實現目標地址轉換:

- ```
- iptables -t nat -A PREROUTING -d 192.168.7.101 -p tcp --dport 3389 -j DNAT --to-destination 172.18.139.20:3389
- iptables -t nat -A POSTROUTING -s 192.168.0.0/21 -j SNAT --to-source 192.168.7.101
```


算法總結

roundrobin-------->tcp/http 動態

leastconn----------->tcp/http 動態

static-rr-------------->tcp/http 靜態

first-------------------->tcp/http 靜態

==source---------------->tcp/http==

==Uri---------------------->http==

==url_param---------->http 取決於hash_type是否consistent==

==hdr--------------------->http==

==rdp-cookie--------->tcp==

 

## Cookie配置

```
cookie <value>:爲當前server指定cookie值,實現基於cookie的會話黏性
cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ preserve ] [ httponly ] [ secure ] [ domain <domain> ]* [ maxidle <idle> ] [ maxlife <life> ]
<name>:cookie名稱,用於實現持久鏈接
rewrite:重寫
insert:插入
prefix:前綴
nocache:當client和hapoxy之間有緩存時,不緩存cookie

```

 

Cookie配置實例

* 基於cookie實現的session 保持

```
listen web_prot_http_nodes
bind 192.168.7.102:80
mode http
cookie SERVER-COOKIE insert indirect nocache
server 192.168.7.101 192.168.7.101:8080 cookie web1 check inter 3000 fall 3 rise 5
server 192.168.7.102 192.168.7.102:8080 cookie web2 check inter 3000 fall 3 rise 5
```

![1548061746306](C:\Users\zhangqiang\AppData\Roaming\Typora\typora-user-images\1548061746306.png)

 

 

### 配置HAProxy狀態頁

```
stats enable #基於默認的參數啓用stats page
stats hide-version # 隱藏版本
stats refresh <delay> # 設定自動刷新時間間隔
stats uri <prefix> #自定義stats page uri,默認值:/haproxy?stats
stats realm <realm> #帳戶認證時的提示信息,示例:stats realm : HAProxy\ Statistics
stats auth <user>:<passwd> #認證時的帳號和密碼,可以使用屢次,默認:no authentication
stats admin { if | unless } <cond> #啓用stats page中的管理功能
```

配置HAProxy狀態頁

```
listen stats
bind :9009
stats enable
#stats hide-version
stats uri /haproxy-status
stats realm HAPorxy\ Stats\ Page
stats auth haadmin:123456
stats auth admin:123456
stats refresh 30s
stats admin if TRUE
```

 

## HAProxy日誌配置

```
在default配置項定義:
log 127.0.0.1 local{1-7} info #基於syslog記錄日誌到指定設備,級別有(err、warning、info、debug)
配置rsyslog:
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log
配置HAProxy:
listen web_port
bind 127.0.0.1:80
mode http
log global
option tcplog
server web1 127.0.0.1:8080 check inter 3000 fall 2 rise 5
重啓syslog服務並訪問haproxy狀態頁
```

 

 

 

## HAProxy動態上下線

```shellyum install socat echo "show info" | socat stdio /var/lib/haproxy/haproxy.sock echo "get weight web_host/192.168.7.101" | socat stdio /var/lib/haproxy/haproxy.sock echo "disable server web_host/192.168.7.101" | socat stdio /var/lib/haproxy/haproxy.sock echo "enable server web_host/192.168.7.101" | socat stdio /var/lib/haproxy/haproxy.sock```

相關文章
相關標籤/搜索