Từ phiên bản 8.0.21, một khung thẻ có thể định cấu hình có sẵn để cho phép siêu dữ liệu của cụm innodb, cụm innodb hoặc bản sao innodb được đánh dấu bằng thông tin bổ sung. Các thẻ cho phép liên kết các cặp giá trị khóa tùy chỉnh với một cụm, bản sao hoặc thể hiện. Các thẻ đã được dành riêng để sử dụng bởi bộ định tuyến MySQL cho phép bộ định tuyến MySQL tương thích để hỗ trợ các trường hợp ẩn khỏi các ứng dụng. Các thẻ sau được dành cho mục đích này:
3 Hướng dẫn bộ định tuyến MySQL: Loại trừ thể hiện khỏi danh sách các điểm đến có thể cho các ứng dụng khách.mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
4: Hướng dẫn bộ định tuyến ngắt kết nối các kết nối hiện có khỏi các trường hợp được đánh dấu là ẩn.mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
Để biết thêm thông tin, xem Xóa các trường hợp khỏi định tuyến.
Ngoài ra, khung thẻ có thể cấu hình người dùng. Các thẻ tùy chỉnh có thể bao gồm bất kỳ ký tự ASCII nào và cung cấp
mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
5, đóng vai trò là các cặp giá trị khóa từ điển có thể được liên kết với các cụm, bản sao hoặc các trường hợp cụ thể của chúng. Giá trị thẻ có thể là bất kỳ giá trị JSON nào. Cấu hình này cho phép bạn thêm các thuộc tính của riêng bạn trên đầu siêu dữ liệu.Hiển thị thẻ
Hoạt động ____ 16.Options [] hiển thị thông tin về các thẻ được gán cho các phiên bản cụm riêng lẻ cũng như chính cụm. Ví dụ: cụm Innodb được gán cho
mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
7 có thể hiển thị:mysql-js> myCluster.options[]
{
"cluster": {
"name": "test1",
"tags": {
"ic-1:3306": [
{
"option": "_disconnect_existing_sessions_when_hidden",
"value": true
},
{
"option": "_hidden",
"value": false
}
],
"ic-2:3306": [],
"ic-3:3306": [],
"global": [
{
"option": "location:",
"value": "US East"
}
]
}
}
}
Cụm này có một thẻ toàn cầu có tên
mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
8 có giá trị mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
9 và trường hợp mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
0 đã được gắn thẻ.Đặt thẻ trên một thể hiện cụm
Bạn có thể đặt thẻ ở cấp độ thể hiện, ví dụ cho phép bạn đánh dấu một thể hiện là không có sẵn, để các ứng dụng và bộ định tuyến coi nó là ngoại tuyến. Sử dụng ________ 16.SetInstanceOption [________ 22,
mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
3, mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
4] để đặt giá trị của thẻ cho ví dụ.Đối số
mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
2 là một chuỗi kết nối với thể hiện đích. Đối số mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
3 phải là một chuỗi có định dạng ________ 15: ________ 23. Tham số mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
4 là giá trị nên được gán cho mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
3 trong mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
5 được chỉ định. Nếu giá trị là mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
2, mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
3 sẽ bị xóa khỏi mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
5 được chỉ định. Đối với các trường hợp thuộc về một cụm, hoạt động mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
5 chỉ chấp nhận không gian tên mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
6. Bất kỳ không gian tên nào khác đều dẫn đến mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
7.mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
5:mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
3
. The mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
4 parameter is the value that should be assigned to mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
3 in the specified mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
5. If the value is mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
2, the mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
3 is removed from the specified mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
5. For instances which belong to a cluster, the mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
5 operation only accepts the mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
6 namespace. Any other namespace results in an
mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
7. Ví dụ: để sử dụng JavaScript để đặt thẻ
mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
8 thành mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
9 trên ví dụ mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
7 mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
0, Số phát hành:mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
Hoặc sử dụng Python để đặt thẻ
mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
8 thành mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
9 trên ví dụ mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
7 mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
0, vấn đề:mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
Loại bỏ các trường hợp khỏi định tuyến
Khi Bộ định tuyến Adminapi và MySQL hoạt động cùng nhau, chúng hỗ trợ các thẻ cụ thể cho phép bạn đánh dấu các phiên bản là ẩn và xóa chúng khỏi định tuyến. Bộ định tuyến MySQL sau đó loại trừ các phiên bản được gắn thẻ như vậy khỏi danh sách ứng cử viên đích định tuyến. Chức năng này cho phép bạn sử dụng một phiên bản máy chủ một cách an toàn để các ứng dụng và bộ định tuyến MySQL bỏ qua nó. Ví dụ: trong khi bạn thực hiện các tác vụ bảo trì, chẳng hạn như nâng cấp máy chủ hoặc thay đổi cấu hình.
Khi thẻ
mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
3 được đặt thành TRUE, điều này sẽ hướng dẫn bộ định tuyến MySQL loại trừ phiên bản khỏi danh sách các điểm đến có thể cho các ứng dụng khách. Ví dụ vẫn trực tuyến, nhưng không được chuyển đến các kết nối mới đến. TAG mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
4 kiểm soát cách các kết nối hiện có với phiên bản được đóng. Thẻ này được coi là đúng và nó hướng dẫn bất kỳ trường hợp bộ định tuyến MySQL nào khởi động chống lại cụm Innodb, Innodb Clusterset hoặc Innodb replicAset để ngắt kết nối bất kỳ kết nối hiện có nào khỏi trường hợp khi thẻ mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
3 là đúng.Khi
mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
4 là sai, bất kỳ kết nối khách hàng hiện tại nào với phiên bản không được đóng nếu mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
3 là đúng. Các thẻ mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
3 và mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
4 dành riêng cho các trường hợp và không thể được sử dụng ở cấp cụm.Cảnh báo
Khi tùy chọn bộ định tuyến MySQL
mysql-js> myCluster.options[]
{
"cluster": {
"name": "test1",
"tags": {
"ic-1:3306": [
{
"option": "_disconnect_existing_sessions_when_hidden",
"value": true
},
{
"option": "_hidden",
"value": true
}
],
"ic-2:3306": [],
"ic-3:3306": [],
"global": []
}
}
}
3 được bật, nó mặc định là 60 giây. Điều này có nghĩa là khi bạn đặt thẻ, mất tới 60 giây để bộ định tuyến MySQL phát hiện sự thay đổi. Để giảm thời gian chờ đợi, thay đổi mysql-js> myCluster.options[]
{
"cluster": {
"name": "test1",
"tags": {
"ic-1:3306": [
{
"option": "_disconnect_existing_sessions_when_hidden",
"value": true
},
{
"option": "_hidden",
"value": true
}
],
"ic-2:3306": [],
"ic-3:3306": [],
"global": []
}
}
}
3 thành giá trị thấp hơn.Ví dụ: giả sử bạn muốn xóa phiên bản
mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
0 là một phần của cụm innodb được gán cho mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
7 khỏi các điểm đến định tuyến. Sử dụng thao tác JavaScript mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
5 để bật thẻ mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
3 và mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
4:mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
Hoặc sử dụng hoạt động
2020-07-03 16:32:16 metadata_cache INFO [7fa9d164c700] Potential changes detected in cluster 'testCluster' after metadata refresh
2020-07-03 16:32:16 metadata_cache INFO [7fa9d164c700] view_id = 4, [3 members]
2020-07-03 16:32:16 metadata_cache INFO [7fa9d164c700] ic-1:3306 / 33060 - mode=RW
2020-07-03 16:32:16 metadata_cache INFO [7fa9d164c700] ic-1:3306 / 33060 - mode=RO
2020-07-03 16:32:16 metadata_cache INFO [7fa9d164c700] ic-1:3306 / 33060 - mode=RO hidden=yes disconnect_when_hidden=yes
2020-07-03 16:32:16 routing INFO [7fa9d164c700] Routing routing:testCluster_x_ro listening on 64470 got request to disconnect invalid connections: metadata change
2020-07-03 16:32:16 routing INFO [7fa9d164c700] Routing routing:testCluster_x_rw listening on 64460 got request to disconnect invalid connections: metadata change
2020-07-03 16:32:16 routing INFO [7fa9d164c700] Routing routing:testCluster_rw listening on 6446 got request to disconnect invalid connections: metadata change
2020-07-03 16:32:16 routing INFO [7fa9d164c700] Routing routing:testCluster_ro listening on 6447 got request to disconnect invalid connections: metadata change
0 Python để bật thẻ mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
3 và mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
4: mysql-js> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:_hidden", true];
Bạn có thể xác minh sự thay đổi trong siêu dữ liệu bằng cách kiểm tra các tùy chọn. Ví dụ: thay đổi được thực hiện đối với
mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
0 sẽ hiển thị trong các tùy chọn như:mysql-js> myCluster.options[]
{
"cluster": {
"name": "test1",
"tags": {
"ic-1:3306": [
{
"option": "_disconnect_existing_sessions_when_hidden",
"value": true
},
{
"option": "_hidden",
"value": true
}
],
"ic-2:3306": [],
"ic-3:3306": [],
"global": []
}
}
}
Bạn có thể xác minh rằng bộ định tuyến MySQL đã phát hiện ra sự thay đổi trong siêu dữ liệu bằng cách xem tệp nhật ký. Một bộ định tuyến MySQL đã phát hiện ra sự thay đổi được thực hiện thành
mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
0 sẽ hiển thị một thay đổi như:2020-07-03 16:32:16 metadata_cache INFO [7fa9d164c700] Potential changes detected in cluster 'testCluster' after metadata refresh
2020-07-03 16:32:16 metadata_cache INFO [7fa9d164c700] view_id = 4, [3 members]
2020-07-03 16:32:16 metadata_cache INFO [7fa9d164c700] ic-1:3306 / 33060 - mode=RW
2020-07-03 16:32:16 metadata_cache INFO [7fa9d164c700] ic-1:3306 / 33060 - mode=RO
2020-07-03 16:32:16 metadata_cache INFO [7fa9d164c700] ic-1:3306 / 33060 - mode=RO hidden=yes disconnect_when_hidden=yes
2020-07-03 16:32:16 routing INFO [7fa9d164c700] Routing routing:testCluster_x_ro listening on 64470 got request to disconnect invalid connections: metadata change
2020-07-03 16:32:16 routing INFO [7fa9d164c700] Routing routing:testCluster_x_rw listening on 64460 got request to disconnect invalid connections: metadata change
2020-07-03 16:32:16 routing INFO [7fa9d164c700] Routing routing:testCluster_rw listening on 6446 got request to disconnect invalid connections: metadata change
2020-07-03 16:32:16 routing INFO [7fa9d164c700] Routing routing:testCluster_ro listening on 6447 got request to disconnect invalid connections: metadata change
Để đưa phiên bản trở lại trực tuyến, hãy sử dụng thao tác
mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
5 để xóa các thẻ và bộ định tuyến MySQL tự động thêm phiên bản trở lại các điểm đến định tuyến và nó trở thành trực tuyến cho các ứng dụng. Ví dụ:mysql-js> myCluster.setInstanceOption[icadmin@ic-1:3306, "tag:_hidden", false];
Xác minh thay đổi trong siêu dữ liệu bằng cách kiểm tra lại các tùy chọn:
mysql-js> myCluster.options[]
{
"cluster": {
"name": "test1",
"tags": {
"ic-1:3306": [
{
"option": "_disconnect_existing_sessions_when_hidden",
"value": true
},
{
"option": "_hidden",
"value": false
}
],
"ic-2:3306": [],
"ic-3:3306": [],
"global": []
}
}
}
Đặt thẻ trên một cụm
Hoạt động ____ 16.SetOption [____ 23,
mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
4] cho phép bạn thay đổi giá trị của tùy chọn không gian tên cho toàn bộ cụm. Đối số mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
3 phải là một chuỗi có định dạng ________ 15: ________ 23.mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
5:mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
3
. Tham số
mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
4 là giá trị được gán cho mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
3 trong mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
5 được chỉ định. Nếu giá trị là mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
2, mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
3 sẽ bị xóa khỏi mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
5 được chỉ định. Đối với các cụm, hoạt động mysql-js> myCluster.setInstanceOption[icadmin@ic-1:3306, "tag:_hidden", false];
8 chấp nhận không gian tên mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
6. Bất kỳ không gian tên nào khác đều dẫn đến mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
7.Mẹo
Các thẻ được đặt ở cấp độ cụm không ghi đè các thẻ được đặt ở cấp độ thể hiện. Bạn không thể sử dụng ________ 16.SetOption [] để xóa tất cả các thẻ được đặt ở cấp độ thể hiện.
Không có yêu cầu cho tất cả các trường hợp được trực tuyến, chỉ có điều mà cụm có đại biểu. Để gắn thẻ cụm InnoDB được gán cho
mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
7 với thẻ mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
8 được đặt cho chúng tôi về phía đông, phát hành những điều sau đây trong JavaScript:mysql-js> myCluster.setOption["tag:location", "US East"]
mysql-js> myCluster.options[]
{
"cluster": {
"name": "test1",
"tags": {
"ic-1:3306": [],
"ic-2:3306": [],
"ic-3:3306": [],
"global": [
{
"option": "location:",
"value": "US East"
}
]
}
}
}
Hoặc phát hành những điều sau đây trong Python:
mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
0Xóa thẻ khỏi cụm
Để xóa thẻ khỏi cụm, hãy sử dụng thao tác ____ 16.SetOption [____ 23,
mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
4] với giá trị mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
2 trong JavaScript và giá trị mysql-js> myCluster.options[]
{
"cluster": {
"name": "test1",
"tags": {
"ic-1:3306": [
{
"option": "_disconnect_existing_sessions_when_hidden",
"value": true
},
{
"option": "_hidden",
"value": false
}
],
"ic-2:3306": [],
"ic-3:3306": [],
"global": []
}
}
}
8 trong Python.Để xóa thẻ khỏi cụm innodb được gán cho
mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
7 bằng thẻ mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
8, hãy đưa ra những điều sau đây trong JavaScript:mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
1Hoặc sử dụng Python:
mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
2Người dùng được xác định gắn thẻ
Adminapi hỗ trợ không gian tên
mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
6, nơi bạn có thể lưu trữ thông tin trong các cặp giá trị khóa được liên kết với một cụm, bản sao hoặc phiên bản nhất định. Các tùy chọn trong không gian tên mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:_hidden", true];
6 không bị ràng buộc, có nghĩa là bạn có thể gắn thẻ với bất kỳ thông tin nào bạn chọn, miễn là nó là định danh ASCII MySQL hợp lệ.Bạn có thể sử dụng bất kỳ tên và giá trị nào cho một thẻ, miễn là tên theo cú pháp sau: _ hoặc các chữ cái theo sau là ký tự chữ và số và _.
Tùy chọn
mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
5 là một chuỗi phân tách đại tràng với định dạng mysql-js> myCluster.setOption["tag:location", "US East"]
mysql-js> myCluster.options[]
{
"cluster": {
"name": "test1",
"tags": {
"ic-1:3306": [],
"ic-2:3306": [],
"ic-3:3306": [],
"global": [
{
"option": "location:",
"value": "US East"
}
]
}
}
}
4, trong đó mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
5 là tên của không gian tên và mysql-py> myCluster.set_instance_option["icadmin@ic-1:3306", "tag:test", True];
3 là tên tùy chọn thực tế. Bạn có thể đặt và xóa các thẻ ở cấp độ thể hiện hoặc ở cấp cụm hoặc bản sao.Tên thẻ có thể có bất kỳ giá trị nào miễn là nó bắt đầu bằng một chữ cái hoặc dấu gạch dưới, tùy chọn theo sau là ký tự chữ và số và
mysql-js> myCluster.setOption["tag:location", "US East"]
mysql-js> myCluster.options[]
{
"cluster": {
"name": "test1",
"tags": {
"ic-1:3306": [],
"ic-2:3306": [],
"ic-3:3306": [],
"global": [
{
"option": "location:",
"value": "US East"
}
]
}
}
}
7, ví dụ, mysql-js> myCluster.setOption["tag:location", "US East"]
mysql-js> myCluster.options[]
{
"cluster": {
"name": "test1",
"tags": {
"ic-1:3306": [],
"ic-2:3306": [],
"ic-3:3306": [],
"global": [
{
"option": "location:",
"value": "US East"
}
]
}
}
}
8. Chỉ các thẻ tích hợp mới được phép bắt đầu với ký tự mysql-js> myCluster.setOption["tag:location", "US East"]
mysql-js> myCluster.options[]
{
"cluster": {
"name": "test1",
"tags": {
"ic-1:3306": [],
"ic-2:3306": [],
"ic-3:3306": [],
"global": [
{
"option": "location:",
"value": "US East"
}
]
}
}
}
7.Cách bạn sử dụng thẻ tùy chỉnh là tùy thuộc vào bạn. Bạn có thể đặt một thẻ tùy chỉnh trên một cụm để đánh dấu vị trí của cụm. Ví dụ: đặt một thẻ tùy chỉnh có tên vị trí có giá trị
mysql-js> myCluster.setInstanceOption["icadmin@ic-1:3306", "tag:test", true];
00 trên cụm.